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
9template<typename T>
10struct identity {
11  typedef T type;
12};
13
14template<typename R, typename T, typename Arg1>
15void 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
21template void test_class_method<ClassMethods, ClassMethods>(void*);
22template void test_class_method<ClassMethods, ClassMethods>(int*);
23
24@interface ClassMethods2
25+ (ClassMethods2 *)method1:(int*)ptr;
26@end
27
28template 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
35template<typename R, typename T, typename Arg1>
36void 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
43template void test_instance_method<InstanceMethods, InstanceMethods>(void*);
44template void test_instance_method<InstanceMethods, InstanceMethods>(int*);
45
46@interface InstanceMethods2
47- (InstanceMethods2 *)method1:(void*)ptr;
48@end
49
50template void test_instance_method<InstanceMethods2, InstanceMethods2>(int*); // expected-note{{in instantiation of}}
51