1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | // Test template instantiation of Objective-C message sends. |
4 | |
5 | @interface ClassMethods |
6 | + (ClassMethods *)method1:(void*)ptr; |
7 | @end |
8 | |
9 | template<typename T> |
10 | struct identity { |
11 | typedef T type; |
12 | }; |
13 | |
14 | template<typename R, typename T, typename Arg1> |
15 | void test_class_method(Arg1 arg1) { |
16 | R *result1 = [T method1:arg1]; |
17 | R *result2 = [typename identity<T>::type method1:arg1]; |
18 | R *result3 = [ClassMethods method1:arg1]; // expected-error{{cannot initialize a variable of type 'ClassMethods2 *' with an rvalue of type 'ClassMethods *'}} |
19 | } |
20 | |
21 | template void test_class_method<ClassMethods, ClassMethods>(void*); |
22 | template void test_class_method<ClassMethods, ClassMethods>(int*); |
23 | |
24 | @interface ClassMethods2 |
25 | + (ClassMethods2 *)method1:(int*)ptr; |
26 | @end |
27 | |
28 | template void test_class_method<ClassMethods2, ClassMethods2>(int*); // expected-note{{in instantiation of}} |
29 | |
30 | |
31 | @interface InstanceMethods |
32 | - (InstanceMethods *)method1:(void*)ptr; |
33 | @end |
34 | |
35 | template<typename R, typename T, typename Arg1> |
36 | void test_instance_method(Arg1 arg1) { |
37 | T *receiver = 0; |
38 | InstanceMethods *im = 0; |
39 | R *result1 = [receiver method1:arg1]; |
40 | R *result2 = [im method1:arg1]; // expected-error{{cannot initialize a variable of type 'InstanceMethods2 *' with an rvalue of type 'InstanceMethods *'}} |
41 | } |
42 | |
43 | template void test_instance_method<InstanceMethods, InstanceMethods>(void*); |
44 | template void test_instance_method<InstanceMethods, InstanceMethods>(int*); |
45 | |
46 | @interface InstanceMethods2 |
47 | - (InstanceMethods2 *)method1:(void*)ptr; |
48 | @end |
49 | |
50 | template void test_instance_method<InstanceMethods2, InstanceMethods2>(int*); // expected-note{{in instantiation of}} |
51 | |