| // RUN: %clang_cc1 -fsyntax-only -verify %s | 
 |  | 
 | @class NSString; | 
 |  | 
 | // Reduced from WebKit. | 
 | namespace test0 { | 
 |   template <typename T> struct RemovePointer { | 
 |     typedef T Type; | 
 |   }; | 
 |  | 
 |   template <typename T> struct RemovePointer<T*> { | 
 |     typedef T Type; | 
 |   }; | 
 |  | 
 |   template <typename T> struct RetainPtr { | 
 |     typedef typename RemovePointer<T>::Type ValueType; | 
 |     typedef ValueType* PtrType; | 
 |     RetainPtr(PtrType ptr); | 
 |   }; | 
 |   | 
 |   void test(NSString *S) { | 
 |     RetainPtr<NSString*> ptr(S); | 
 |   } | 
 |  | 
 |   void test(id S) { | 
 |     RetainPtr<id> ptr(S); | 
 |   } | 
 | } | 
 |  | 
 | @class Test1Class; | 
 | @protocol Test1Protocol; | 
 | namespace test1 { | 
 |   template <typename T> struct RemovePointer { | 
 |     typedef T type; | 
 |   }; | 
 |   template <typename T> struct RemovePointer<T*> { | 
 |     typedef T type; | 
 |   }; | 
 |   template <typename A, typename B> struct is_same {}; | 
 |   template <typename A> struct is_same<A,A> { | 
 |     static void foo(); | 
 |   }; | 
 |   template <typename T> struct tester { | 
 |     void test() { | 
 |       is_same<T, typename RemovePointer<T>::type*>::foo(); // expected-error 2 {{no member named 'foo'}} | 
 |     } | 
 |   }; | 
 |  | 
 |   template struct tester<id>; | 
 |   template struct tester<id<Test1Protocol> >; | 
 |   template struct tester<Class>; | 
 |   template struct tester<Class<Test1Protocol> >; | 
 |   template struct tester<Test1Class*>; | 
 |   template struct tester<Test1Class<Test1Protocol>*>; | 
 |  | 
 |   template struct tester<Test1Class>; // expected-note {{in instantiation}} | 
 |   template struct tester<Test1Class<Test1Protocol> >; // expected-note {{in instantiation}} | 
 | } | 
 |  | 
 | namespace test2 { | 
 |   template <typename T> void foo(const T* t) {} | 
 |   void test(id x) { | 
 |     foo(x); | 
 |   } | 
 | } |