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 // expected-warning 3 {{direct access to Objective-C's isa is deprecated in favor of object_getClass()}} 25} 26 27template void f<6, Class>(int, int); // expected-note{{in instantiation of}} 28template void f<7, Class>(int*, int); // expected-note{{in instantiation of}} 29template void f<8, Class>(int, double*); // expected-note{{in instantiation of}} 30template void f<9, int>(int, int); // expected-note{{in instantiation of}} 31 32// Test instantiation of unresolved member reference expressions to an 33// ivar reference. 34template<typename T, typename U, typename V> 35void f2(T ptr, U value, V value2) { 36 ptr->ivar = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 37 ptr.prop = value2; // expected-error{{assigning to 'int' from incompatible type 'double *'}} 38} 39 40template void f2(A*, int, int); 41template void f2(A*, int*, int); // expected-note{{instantiation of}} 42template void f2(A*, int, double*); // expected-note{{instantiation of}} 43 44// Test instantiation of unresolved member referfence expressions to 45// an isa. 46template<typename T, typename U> 47void f3(U ptr) { 48 T c = ptr->isa; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'Class'}} \ 49 // expected-warning 1 {{direct access to Objective-C's isa is deprecated in favor of object_getClass()}} 50} 51 52template void f3<Class>(id); // expected-note{{in instantiation of}} 53template void f3<int>(id); // expected-note{{instantiation of}} 54 55// Implicit setter/getter 56@interface B 57- (int)foo; 58- (void)setFoo:(int)value; 59@end 60 61template<typename T> 62void f4(B *b, T value) { 63 b.foo = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 64} 65 66template void f4(B*, int); 67template void f4(B*, int*); // expected-note{{in instantiation of function template specialization 'f4<int *>' requested here}} 68 69template<typename T, typename U> 70void f5(T ptr, U value) { 71 ptr.foo = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}} 72} 73 74template void f5(B*, int); 75template void f5(B*, int*); // expected-note{{in instantiation of function template specialization 'f5<B *, int *>' requested here}} 76