// RUN: clang -fsyntax-only -verify %s typedef signed char BOOL; @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; @protocol NSObject - (BOOL)isEqual:(id)object; @end @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end @interface NSObject {} @end @class NSArray, NSAttributedString, NSEvent, NSInputServer, NSImage; @interface NSController : NSObject {} @end @class OzzyView; typedef struct _OzzyInset {} OzzyInset; @protocol OzzyP; typedef NSObject Ozzy; @protocol OzzyAnchorP; typedef NSObject OzzyAnchor; @protocol OzzyAnchorDelegateP - (BOOL)anchor:(OzzyAnchor *)anchor confirmRepresentedObject:(id)newObject; @end typedef NSObject OzzyAnchorDelegate; // GCC doesn't warn about the following (which is inconsistent with it's handling of @interface below). @protocol OzzyAnchorP // expected-warning{{cannot find protocol definition for 'OzzyP'}} @property(nonatomic,retain) id representedObject; @property(nonatomic,retain) Ozzy * contentGroup; @end @interface XXX : NSObject // expected-warning{{cannot find protocol definition for 'OzzyP'}} @end @protocol OzzyActionDelegateP @optional - (BOOL)elementView:(OzzyView *)elementView shouldDragElement:(Ozzy *)element; @end typedef NSObject OzzyActionDelegate; @interface OzzyUnit : OzzyAnchorDelegate {} @end @interface OzzyArrayUnit : OzzyUnit {} @end @implementation OzzyArrayUnit - (BOOL)willChangeLayoutForObjects:(NSArray *)objects fromObjects:(NSArray *)oldObjects {} - (void)_recalculateStoredArraysForAnchor:(OzzyAnchor *)anchor { Ozzy * contentGroup = anchor.contentGroup; if (contentGroup == ((void *)0)) { // GCC doesn't warn about the following (which seems wrong). contentGroup = anchor; // expected-warning{{incompatible pointer types assigning 'OzzyAnchor *', expected 'Ozzy *'}} } } @end