blob: 583fb4b3cc05d107c12fbe90a40179d817ca8cff [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregorcc2427c2009-09-11 22:57:37 +00002struct A0 {
3 struct K { };
4};
5
6template <typename T> struct B0: A0 {
7 static void f() {
8 K k;
9 }
10};
11
12namespace E1 {
13 typedef double A;
14
15 template<class T> class B {
16 typedef int A;
17 };
18
19 template<class T>
20 struct X : B<T> {
21 A* blarg(double *dp) {
22 return dp;
23 }
24 };
25}
26
27namespace E2 {
28 struct A {
29 struct B;
30 int *a;
31 int Y;
32 };
33
34 int a;
35 template<class T> struct Y : T {
36 struct B { /* ... */ };
37 B b;
38 void f(int i) { a = i; }
39 Y* p;
40 };
41
42 Y<A> ya;
43}
Richard Smithd80b2d52012-11-22 00:24:47 +000044
45namespace PR14402 {
46 template<typename T>
47 struct A {
48 typedef int n;
49 int f();
50
51 struct B {};
52 struct C : B {
53 // OK, can't be sure whether we derive from A yet.
54 using A::n;
55 int g() { return f(); }
56 };
57
58 struct D {
59 using A::n; // expected-error {{using declaration refers into 'A<T>::', which is not a base class of 'D'}}
60 int g() { return f(); } // expected-error {{call to non-static member function 'f' of 'A' from nested type 'D'}}
61 };
62
63 struct E { char &f(); };
64 struct F : E {
65 // FIXME: Reject this prior to instantiation; f() is known to return int.
66 char &g() { return f(); }
67 // expected-error@-1 {{'PR14402::A<int>::f' is not a member of class 'PR14402::A<int>::F'}}
68 // expected-error@-2 {{non-const lvalue reference to type 'char' cannot bind to a temporary of type 'int'}}
69 };
70 };
71
72 template<> struct A<int>::B : A<int> {};
73 A<int>::C::n n = A<int>::C().g();
74
75 // 'not a member'
76 char &r = A<int>::F().g(); // expected-note {{in instantiation of}}
77 template<> struct A<char>::E : A<char> {};
78 // 'cannot bind to a temporary'
79 char &s = A<char>::F().g(); // expected-note {{in instantiation of}}
Richard Smithb2c5f962012-11-22 00:40:54 +000080
81 struct X;
82 struct X { void f(); };
83 struct X;
84 template<typename T> struct Y : X {
85 void g() {
86 X::f();
87 }
88 };
Richard Smithd80b2d52012-11-22 00:24:47 +000089}