1 // RUN: %clang_cc1 -fsyntax-only -verify %s
10 typedef struct objc_object {
14 // Test instantiation of value-dependent ObjCIvarRefExpr,
15 // ObjCIsaRefExpr, and ObjCPropertyRefExpr nodes.
16 A *get_an_A(unsigned);
17 id get_an_id(unsigned);
19 template<unsigned N, typename T, typename U, typename V>
20 void f(U value, V value2) {
21 get_an_A(N)->ivar = value; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *}}
22 get_an_A(N).prop = value2; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from '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()}}
27 template void f<6, Class>(int, int); // expected-note{{in instantiation of}}
28 template void f<7, Class>(int*, int); // expected-note{{in instantiation of}}
29 template void f<8, Class>(int, double*); // expected-note{{in instantiation of}}
30 template void f<9, int>(int, int); // expected-note{{in instantiation of}}
32 // Test instantiation of unresolved member reference expressions to an
34 template<typename T, typename U, typename V>
35 void f2(T ptr, U value, V value2) {
36 ptr->ivar = value; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *}}
37 ptr.prop = value2; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'double *'}}
40 template void f2(A*, int, int);
41 template void f2(A*, int*, int); // expected-note{{instantiation of}}
42 template void f2(A*, int, double*); // expected-note{{instantiation of}}
44 // Test instantiation of unresolved member referfence expressions to
46 template<typename T, typename U>
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()}}
52 template void f3<Class>(id); // expected-note{{in instantiation of}}
53 template void f3<int>(id); // expected-note{{instantiation of}}
55 // Implicit setter/getter
58 - (void)setFoo:(int)value;
62 void f4(B *b, T value) {
63 b.foo = value; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *}}
66 template void f4(B*, int);
67 template void f4(B*, int*); // expected-note{{in instantiation of function template specialization 'f4<int *>' requested here}}
69 template<typename T, typename U>
70 void f5(T ptr, U value) {
71 ptr.foo = value; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *}}
74 template void f5(B*, int);
75 template void f5(B*, int*); // expected-note{{in instantiation of function template specialization 'f5<B *, int *>' requested here}}