1// RUN: %clang_cc1 -fsyntax-only -verify %s 2 3@interface A { 4@public 5 int ivar; 6} 7@property int prop; 8@end 9 10typedef struct objc_object { 11 Class isa; 12} *id; 13 14// Test instantiation of value-dependent ObjCIvarRefExpr, 15// ObjCIsaRefExpr, and ObjCPropertyRefExpr nodes. 16A *get_an_A(unsigned); 17id get_an_id(unsigned); 18 19template<unsigned N, typename T, typename U, typename V> 20void f(U value, V value2) { 21 get_an_A(N)->ivar = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 22 get_an_A(N).prop = value2; // expected-error{{assigning to 'int' from incompatible type 'double *'}} 23 T c = get_an_id(N)->isa; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'Class'}} 24} 25 26template void f<6, Class>(int, int); 27template void f<7, Class>(int*, int); // expected-note{{in instantiation of}} 28template void f<8, Class>(int, double*); // expected-note{{in instantiation of}} 29template void f<9, int>(int, int); // expected-note{{in instantiation of}} 30 31// Test instantiation of unresolved member reference expressions to an 32// ivar reference. 33template<typename T, typename U, typename V> 34void f2(T ptr, U value, V value2) { 35 ptr->ivar = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 36 ptr.prop = value2; // expected-error{{assigning to 'int' from incompatible type 'double *'}} 37} 38 39template void f2(A*, int, int); 40template void f2(A*, int*, int); // expected-note{{instantiation of}} 41template void f2(A*, int, double*); // expected-note{{instantiation of}} 42 43// Test instantiation of unresolved member referfence expressions to 44// an isa. 45template<typename T, typename U> 46void f3(U ptr) { 47 T c = ptr->isa; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'Class'}} 48} 49 50template void f3<Class>(id); 51template void f3<int>(id); // expected-note{{instantiation of}} 52 53// Implicit setter/getter 54@interface B 55- (int)foo; 56- (void)setFoo:(int)value; 57@end 58 59template<typename T> 60void f4(B *b, T value) { 61 b.foo = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 62} 63 64template void f4(B*, int); 65template void f4(B*, int*); // expected-note{{in instantiation of function template specialization 'f4<int *>' requested here}} 66 67template<typename T, typename U> 68void f5(T ptr, U value) { 69 ptr.foo = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 70} 71 72template void f5(B*, int); 73template void f5(B*, int*); // expected-note{{in instantiation of function template specialization 'f5<B *, int *>' requested here}} 74