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 | |