1// RUN: clang-cc -fsyntax-only -verify -pedantic %s 2@protocol NSObject 3@end 4 5@protocol DTOutputStreams <NSObject> 6@end 7 8@interface DTFilterOutputStream <DTOutputStreams> 9- nextOutputStream; 10@end 11 12@implementation DTFilterOutputStream 13- (id)initWithNextOutputStream:(id <DTOutputStreams>) outputStream { 14 id <DTOutputStreams> nextOutputStream = [self nextOutputStream]; 15 self = nextOutputStream; 16 return nextOutputStream ? nextOutputStream : self; 17} 18- nextOutputStream { 19 return self; 20} 21@end 22 23@interface DTFilterOutputStream2 24- nextOutputStream; 25@end 26 27@implementation DTFilterOutputStream2 // expected-warning {{incomplete implementation}} expected-warning {{method definition for 'nextOutputStream' not found}} 28- (id)initWithNextOutputStream:(id <DTOutputStreams>) outputStream { 29 id <DTOutputStreams> nextOutputStream = [self nextOutputStream]; 30 // GCC warns about both of these. 31 self = nextOutputStream; // expected-warning {{incompatible type assigning 'id<DTOutputStreams>', expected 'DTFilterOutputStream2 *'}} 32 return nextOutputStream ? nextOutputStream : self; 33} 34@end 35 36// No @interface declaration for DTFilterOutputStream3 37@implementation DTFilterOutputStream3 // expected-warning {{cannot find interface declaration for 'DTFilterOutputStream3'}} 38- (id)initWithNextOutputStream:(id <DTOutputStreams>) outputStream { 39 id <DTOutputStreams> nextOutputStream = [self nextOutputStream]; // expected-warning {{method '-nextOutputStream' not found (return type defaults to 'id')}} 40 // GCC warns about both of these as well (no errors). 41 self = nextOutputStream; // expected-warning {{incompatible type assigning 'id<DTOutputStreams>', expected 'DTFilterOutputStream3 *'}} 42 return nextOutputStream ? nextOutputStream : self; 43} 44@end 45