// RUN: %clang_cc1 -fsyntax-only -verify %s
// Test template instantiation of Objective-C message sends.
@interfaceClassMethods+ (ClassMethods *)method1:(void*)ptr;@endtemplate<typename T>structidentity{typedef T type;};template<typename R,typename T,typename Arg1>voidtest_class_method(Arg1 arg1){
R *result1 =[Tmethod1:arg1];
R *result2 =[typename identity<T>::typemethod1:arg1];
R *result3 =[ClassMethodsmethod1:arg1];// expected-error{{cannot initialize a variable of type 'ClassMethods2 *' with an rvalue of type 'ClassMethods *'}}
}templatevoidtest_class_method<ClassMethods, ClassMethods>(void*);templatevoidtest_class_method<ClassMethods, ClassMethods>(int*);@interfaceClassMethods2+ (ClassMethods2 *)method1:(int*)ptr;@endtemplatevoidtest_class_method<ClassMethods2, ClassMethods2>(int*);// expected-note{{in instantiation of}}
@interfaceInstanceMethods- (InstanceMethods *)method1:(void*)ptr;@endtemplate<typename R,typename T,typename Arg1>voidtest_instance_method(Arg1 arg1){
T *receiver =0;
InstanceMethods *im =0;
R *result1 =[receivermethod1:arg1];
R *result2 =[immethod1:arg1];// expected-error{{cannot initialize a variable of type 'InstanceMethods2 *' with an rvalue of type 'InstanceMethods *'}}
}templatevoidtest_instance_method<InstanceMethods, InstanceMethods>(void*);templatevoidtest_instance_method<InstanceMethods, InstanceMethods>(int*);@interfaceInstanceMethods2- (InstanceMethods2 *)method1:(void*)ptr;@endtemplatevoidtest_instance_method<InstanceMethods2, InstanceMethods2>(int*);// expected-note{{in instantiation of}}