| // 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); |
| } |
| } |