/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
/* { dg-do compile } */

#include <objc/objc.h>

/* Test that the compiler can correctly compare protocols in types of
   method signatures.  In this test we look at protocols implementing
   other protocols.  The fact that one protocol implements another one
   doesn't mean that they are identical.  */

@protocol A
- (void) doSomething;
@end

@protocol B <A>
- (void) doSomethingElse;
@end

@protocol C <A>
- (void) doYetSomethingElse;
@end

@interface MyClass2
- (void) aMethod: (id <A>)x;  /* { dg-message "previous declaration" } */
- (void) aMethod: (id <B>)x;  /* { dg-error "duplicate declaration" } */

- (void) bMethod: (id <B>)x;  /* { dg-message "previous declaration" } */
- (void) bMethod: (id <A>)x;  /* { dg-error "duplicate declaration" } */

- (void) cMethod: (id <A, B>)x;
- (void) cMethod: (id <B>)x;  /* Ok - because if you implement B, then you also implement A, so <B> == <A, B> */

- (void) dMethod: (id <A, B>)x;
- (void) dMethod: (id <B, A>)x; /* Ok */

- (void) eMethod: (id <A>)x;    /* { dg-message "previous declaration" } */
- (void) eMethod: (id <B, C>)x; /* { dg-error "duplicate declaration" } */

- (void) fMethod: (id <B, C>)x;    /* { dg-message "previous declaration" } */
- (void) fMethod: (id <A>)x;       /* { dg-error "duplicate declaration" } */

- (void) gMethod: (id <A>)x;       /* { dg-message "previous declaration" } */
- (void) gMethod: (id <A, B, C>)x; /* { dg-error "duplicate declaration" } */

- (void) hMethod: (id <A, B, C>)x; /* { dg-message "previous declaration" } */
- (void) hMethod: (id <A>)x;       /* { dg-error "duplicate declaration" } */
@end
