xref: /aosp_15_r20/external/clang/test/SemaCXX/qualified-id-lookup.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li namespace Ns {
3*67e74705SXin Li   int f(); // expected-note{{previous declaration is here}}
4*67e74705SXin Li 
5*67e74705SXin Li   enum E {
6*67e74705SXin Li     Enumerator
7*67e74705SXin Li   };
8*67e74705SXin Li }
9*67e74705SXin Li namespace Ns {
10*67e74705SXin Li   double f(); // expected-error{{functions that differ only in their return type cannot be overloaded}}
11*67e74705SXin Li 
12*67e74705SXin Li   int x = Enumerator;
13*67e74705SXin Li }
14*67e74705SXin Li 
15*67e74705SXin Li namespace Ns2 {
16*67e74705SXin Li   float f();
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li int y = Ns::Enumerator;
20*67e74705SXin Li 
21*67e74705SXin Li namespace Ns2 {
22*67e74705SXin Li   float f(int); // expected-note{{previous declaration is here}}
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li namespace Ns2 {
26*67e74705SXin Li   double f(int); // expected-error{{functions that differ only in their return type cannot be overloaded}}
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li namespace N {
30*67e74705SXin Li   int& f1();
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li namespace N {
34*67e74705SXin Li   struct f1 {
35*67e74705SXin Li     static int member;
36*67e74705SXin Li 
37*67e74705SXin Li     typedef int type;
38*67e74705SXin Li 
39*67e74705SXin Li     void foo(type);
40*67e74705SXin Li   };
41*67e74705SXin Li 
test_f1()42*67e74705SXin Li   void test_f1() {
43*67e74705SXin Li     int &i1 = f1();
44*67e74705SXin Li   }
45*67e74705SXin Li }
46*67e74705SXin Li 
foo(int i)47*67e74705SXin Li void N::f1::foo(int i) {
48*67e74705SXin Li   f1::member = i;
49*67e74705SXin Li   f1::type &ir = i;
50*67e74705SXin Li }
51*67e74705SXin Li 
52*67e74705SXin Li namespace N {
f1(int x)53*67e74705SXin Li   float& f1(int x) {
54*67e74705SXin Li     N::f1::type& i1 = x;
55*67e74705SXin Li     f1::type& i2 = x;
56*67e74705SXin Li   }
57*67e74705SXin Li 
58*67e74705SXin Li   struct f2 {
59*67e74705SXin Li     static int member;
60*67e74705SXin Li   };
61*67e74705SXin Li   void f2();
62*67e74705SXin Li }
63*67e74705SXin Li 
64*67e74705SXin Li int i1 = N::f1::member;
65*67e74705SXin Li typedef struct N::f1 type1;
66*67e74705SXin Li int i2 = N::f2::member;
67*67e74705SXin Li typedef struct N::f2 type2;
68*67e74705SXin Li 
test_f1(int i)69*67e74705SXin Li void test_f1(int i) {
70*67e74705SXin Li   int &v1 = N::f1();
71*67e74705SXin Li   float &v2 = N::f1(i);
72*67e74705SXin Li   int v3 = ::i1;
73*67e74705SXin Li   int v4 = N::f1::member;
74*67e74705SXin Li }
75*67e74705SXin Li 
76*67e74705SXin Li typedef int f2_type;
77*67e74705SXin Li namespace a {
78*67e74705SXin Li   typedef int f2_type(int, int);
79*67e74705SXin Li 
test_f2()80*67e74705SXin Li   void test_f2() {
81*67e74705SXin Li     ::f2_type(1, 2); // expected-error {{excess elements in scalar initializer}}
82*67e74705SXin Li   }
83*67e74705SXin Li }
84*67e74705SXin Li 
85*67e74705SXin Li // PR clang/3291
86*67e74705SXin Li namespace a {
87*67e74705SXin Li   namespace a {   // A1
88*67e74705SXin Li     namespace a { // A2
89*67e74705SXin Li       int i; // expected-note{{'a::a::a::i' declared here}}
90*67e74705SXin Li     }
91*67e74705SXin Li   }
92*67e74705SXin Li }
93*67e74705SXin Li 
test_a()94*67e74705SXin Li void test_a() {
95*67e74705SXin Li   a::a::i = 3; // expected-error{{no member named 'i' in namespace 'a::a'; did you mean 'a::a::a::i'?}}
96*67e74705SXin Li   a::a::a::i = 4;
97*67e74705SXin Li   a::a::j = 3; // expected-error-re{{no member named 'j' in namespace 'a::a'{{$}}}}
98*67e74705SXin Li }
99*67e74705SXin Li 
100*67e74705SXin Li struct Undef { // expected-note{{definition of 'Undef' is not complete until the closing '}'}}
101*67e74705SXin Li   typedef int type;
102*67e74705SXin Li 
103*67e74705SXin Li   Undef::type member;
104*67e74705SXin Li 
105*67e74705SXin Li   static int size = sizeof(Undef); // expected-error{{invalid application of 'sizeof' to an incomplete type 'Undef'}}
106*67e74705SXin Li 
107*67e74705SXin Li   int f();
108*67e74705SXin Li };
109*67e74705SXin Li 
f()110*67e74705SXin Li int Undef::f() {
111*67e74705SXin Li   return sizeof(Undef);
112*67e74705SXin Li }
113*67e74705SXin Li 
114*67e74705SXin Li // PR clang/5667
115*67e74705SXin Li namespace test1 {
116*67e74705SXin Li   template <typename T> struct is_class {
117*67e74705SXin Li     enum { value = 0 };
118*67e74705SXin Li   };
119*67e74705SXin Li 
120*67e74705SXin Li   template <typename T> class ClassChecker {
isClass()121*67e74705SXin Li     bool isClass() {
122*67e74705SXin Li       return is_class<T>::value;
123*67e74705SXin Li     }
124*67e74705SXin Li   };
125*67e74705SXin Li 
126*67e74705SXin Li   template class ClassChecker<int>;
127*67e74705SXin Li }
128*67e74705SXin Li 
129*67e74705SXin Li namespace PR6830 {
130*67e74705SXin Li   namespace foo {
131*67e74705SXin Li 
132*67e74705SXin Li     class X {
133*67e74705SXin Li     public:
X()134*67e74705SXin Li       X() {}
135*67e74705SXin Li     };
136*67e74705SXin Li 
137*67e74705SXin Li   }  // namespace foo
138*67e74705SXin Li 
139*67e74705SXin Li   class Z {
140*67e74705SXin Li   public:
Z(const foo::X & x)141*67e74705SXin Li     explicit Z(const foo::X& x) {}
142*67e74705SXin Li 
Work()143*67e74705SXin Li     void Work() {}
144*67e74705SXin Li   };
145*67e74705SXin Li 
Test()146*67e74705SXin Li   void Test() {
147*67e74705SXin Li     Z(foo::X()).Work();
148*67e74705SXin Li   }
149*67e74705SXin Li }
150*67e74705SXin Li 
151*67e74705SXin Li namespace pr12339 {
152*67e74705SXin Li   extern "C" void i; // expected-error{{variable has incomplete type 'void'}}
153*67e74705SXin Li   pr12339::FOO  // expected-error{{no type named 'FOO' in namespace 'pr12339'}}
154*67e74705SXin Li }  // expected-error{{expected unqualified-id}}
155