1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 @class NSString; 4 5 // Reduced from WebKit. 6 namespace test0 { 7 template <typename T> struct RemovePointer { 8 typedef T Type; 9 }; 10 11 template <typename T> struct RemovePointer<T*> { 12 typedef T Type; 13 }; 14 15 template <typename T> struct RetainPtr { 16 typedef typename RemovePointer<T>::Type ValueType; 17 typedef ValueType* PtrType; 18 RetainPtr(PtrType ptr); 19 }; 20 21 void test(NSString *S) { 22 RetainPtr<NSString*> ptr(S); 23 } 24 25 void test(id S) { 26 RetainPtr<id> ptr(S); 27 } 28 } 29 30 @class Test1Class; 31 @protocol Test1Protocol; 32 namespace test1 { 33 template <typename T> struct RemovePointer { 34 typedef T type; 35 }; 36 template <typename T> struct RemovePointer<T*> { 37 typedef T type; 38 }; 39 template <typename A, typename B> struct is_same {}; 40 template <typename A> struct is_same<A,A> { 41 static void foo(); 42 }; 43 template <typename T> struct tester { 44 void test() { 45 is_same<T, typename RemovePointer<T>::type*>::foo(); // expected-error 2 {{no member named 'foo'}} 46 } 47 }; 48 49 template struct tester<id>; 50 template struct tester<id<Test1Protocol> >; 51 template struct tester<Class>; 52 template struct tester<Class<Test1Protocol> >; 53 template struct tester<Test1Class*>; 54 template struct tester<Test1Class<Test1Protocol>*>; 55 56 template struct tester<Test1Class>; // expected-note {{in instantiation}} 57 template struct tester<Test1Class<Test1Protocol> >; // expected-note {{in instantiation}} 58 } 59 60 namespace test2 { 61 template <typename T> void foo(const T* t) {} 62 void test(id x) { 63 foo(x); 64 } 65 } 66