1/* Test assignments and comparisons between protocols (obscure case). */ 2/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */ 3/* { dg-do compile } */ 4 5#include <objc/objc.h> 6 7@protocol MyProtocolA 8- (void) methodA; 9@end 10 11@protocol MyProtocolB 12- (void) methodB; 13@end 14 15@protocol MyProtocolAB <MyProtocolA, MyProtocolB> 16@end 17 18@protocol MyProtocolAC <MyProtocolA> 19- (void) methodC; 20@end 21 22int main() 23{ 24 id<MyProtocolA> obj_a = nil; 25 id<MyProtocolB> obj_b = nil; 26 id<MyProtocolAB> obj_ab = nil; 27 id<MyProtocolAC> obj_ac = nil; 28 29 obj_a = obj_b; /* { dg-warning "does not conform" } */ 30 obj_a = obj_ab; /* Ok */ 31 obj_a = obj_ac; /* Ok */ 32 33 obj_b = obj_a; /* { dg-warning "does not conform" } */ 34 obj_b = obj_ab; /* Ok */ 35 obj_b = obj_ac; /* { dg-warning "does not conform" } */ 36 37 obj_ab = obj_a; /* { dg-warning "does not conform" } */ 38 obj_ab = obj_b; /* { dg-warning "does not conform" } */ 39 obj_ab = obj_ac; /* { dg-warning "does not conform" } */ 40 41 obj_ac = obj_a; /* { dg-warning "does not conform" } */ 42 obj_ac = obj_b; /* { dg-warning "does not conform" } */ 43 obj_ac = obj_ab; /* { dg-warning "does not conform" } */ 44 45 if (obj_a == obj_b) ; /* { dg-warning "lacks a cast" } */ 46 if (obj_b == obj_a) ; /* { dg-warning "lacks a cast" } */ 47 48 if (obj_a == obj_ab) ; /* Ok */ 49 if (obj_ab == obj_a) ; /* Ok */ /* Spurious 2.95.4 warning here */ 50 51 if (obj_a == obj_ac) ; /* Ok */ 52 if (obj_ac == obj_a) ; /* Ok */ /* Spurious 2.95.4 warning here */ 53 54 if (obj_b == obj_ab) ; /* Ok */ 55 if (obj_ab == obj_b) ; /* Ok */ /* Spurious 2.95.4 warning here */ 56 57 if (obj_b == obj_ac) ; /* { dg-warning "lacks a cast" } */ 58 if (obj_ac == obj_b) ; /* { dg-warning "lacks a cast" } */ 59 60 if (obj_ab == obj_ac) ; /* { dg-warning "lacks a cast" } */ 61 if (obj_ac == obj_ab) ; /* { dg-warning "lacks a cast" } */ 62 63 return 0; 64} 65