1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4 
5 namespace A
6 {
7     namespace B
8     {
9         struct base
10 #if __cplusplus <= 199711L
11         // expected-note@-2 {{lookup in the object type 'A::sub' refers here}}
12 #endif
13         {
xA::B::base14             void x() {}
yA::B::base15             void y() {}
16         };
17     }
18 
19     struct member
20     {
21         void foo();
22     };
23 
24     struct middleman
25     {
operator ->A::middleman26         member * operator->() { return 0; }
27     };
28 
29     struct sub : B::base
30     {
xA::sub31         void x() {}
operator ->A::sub32         middleman operator->() { return middleman(); }
33     };
34 }
35 
36 struct bad
37 {
38   int x();
39 };
40 
41 namespace C
42 {
fun()43     void fun()
44     {
45         A::sub a;
46 
47         a.x();
48 
49         a.sub::x();
50         a.base::x();
51 
52         a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
53 
54         a.A::sub::x();
55         a.A::B::base::x();
56 
57         a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
58 
59         a->foo();
60         a->member::foo();
61         a->A::member::foo();
62     }
63 
fun2()64     void fun2()
65     {
66         A::sub *a;
67 
68         a->x();
69 
70         a->sub::x();
71         a->base::x();
72 
73         a->B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
74 
75         a->A::sub::x();
76         a->A::B::base::x();
77 
78         a->bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
79 
80         (*a)->foo();
81         (*a)->member::foo();
82         (*a)->A::member::foo();
83     }
84 
fun3()85     void fun3()
86     {
87         int i;
88         i.foo(); // expected-error{{member reference base type 'int' is not a structure or union}}
89     }
90 
fun4a()91     void fun4a() {
92       A::sub *a;
93 
94       typedef A::member base;
95 #if __cplusplus <= 199711L
96       // expected-note@-2 {{lookup from the current scope refers here}}
97 #endif
98       a->base::x();
99 #if __cplusplus <= 199711L
100       // expected-error@-2 {{lookup of 'base' in member access expression is ambiguous}}
101 #endif
102     }
103 
fun4b()104     void fun4b() {
105       A::sub *a;
106 
107       typedef A::B::base base;
108       a->base::x();
109     }
110 
111     template<typename T>
fun5()112     void fun5()
113     {
114         T a;
115         a.x();
116         a->foo();
117 
118         a.A::sub::x();
119         a.A::B::base::x();
120         a->A::member::foo();
121 
122         a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
123     }
124 
test_fun5()125   void test_fun5() {
126     fun5<A::sub>(); // expected-note{{instantiation}}
127   }
128 
129   template<typename T>
fun6()130   void fun6() {
131     T a;
132     a.sub::x();
133     a.base::x();
134     a->member::foo();
135     a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
136    }
137 
test_fun6()138   void test_fun6() {
139     fun6<A::sub>(); // expected-note{{instantiation}}
140   }
141 
142 }
143 
144 // PR4703
145 struct a {
146   int a;
147   static int sa;
148 };
149 
150 a a;
151 
152 int a::sa = a.a; // expected-error {{invalid use of non-static data member 'a'}}
153 
154 
155 namespace PR6645 {
156   typedef int foo;
157   namespace Inner {
158     typedef int PR6645::foo; // expected-error{{typedef declarator cannot be qualified}} \
159     // expected-error{{cannot define or redeclare 'foo' here because namespace 'Inner' does not enclose namespace 'PR6645'}}
160   }
161 }
162