xref: /aosp_15_r20/external/clang/test/SemaCXX/namespace.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li namespace A { // expected-note 2 {{previous definition is here}}
6*67e74705SXin Li   int A;
f()7*67e74705SXin Li   void f() { A = 0; }
8*67e74705SXin Li }
9*67e74705SXin Li 
f()10*67e74705SXin Li void f() { A = 0; } // expected-error {{unexpected namespace name 'A': expected expression}}
11*67e74705SXin Li int A; // expected-error {{redefinition of 'A' as different kind of symbol}}
12*67e74705SXin Li class A; // expected-error {{redefinition of 'A' as different kind of symbol}}
13*67e74705SXin Li 
14*67e74705SXin Li class B {}; // expected-note {{previous definition is here}}
15*67e74705SXin Li // expected-note@-1 {{candidate function (the implicit copy assignment operator) not viable}}
16*67e74705SXin Li #if __cplusplus >= 201103L // C++11 or later
17*67e74705SXin Li // expected-note@-3 {{candidate function (the implicit move assignment operator) not viable}}
18*67e74705SXin Li #endif
19*67e74705SXin Li 
20*67e74705SXin Li void C(); // expected-note {{previous definition is here}}
21*67e74705SXin Li namespace C {} // expected-error {{redefinition of 'C' as different kind of symbol}}
22*67e74705SXin Li 
23*67e74705SXin Li namespace D {
24*67e74705SXin Li   class D {};
25*67e74705SXin Li }
26*67e74705SXin Li 
27*67e74705SXin Li namespace S1 {
28*67e74705SXin Li   int x;
29*67e74705SXin Li 
30*67e74705SXin Li   namespace S2 {
31*67e74705SXin Li 
32*67e74705SXin Li     namespace S3 {
33*67e74705SXin Li       B x;
34*67e74705SXin Li     }
35*67e74705SXin Li   }
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li namespace S1 {
f()39*67e74705SXin Li   void f() {
40*67e74705SXin Li     x = 0;
41*67e74705SXin Li   }
42*67e74705SXin Li 
43*67e74705SXin Li   namespace S2 {
44*67e74705SXin Li 
45*67e74705SXin Li     namespace S3 {
f()46*67e74705SXin Li       void f() {
47*67e74705SXin Li         x = 0; // expected-error {{no viable overloaded '='}}
48*67e74705SXin Li       }
49*67e74705SXin Li     }
50*67e74705SXin Li 
51*67e74705SXin Li     int y;
52*67e74705SXin Li   }
53*67e74705SXin Li }
54*67e74705SXin Li 
55*67e74705SXin Li namespace S1 {
56*67e74705SXin Li   namespace S2 {
57*67e74705SXin Li     namespace S3 {
f3()58*67e74705SXin Li       void f3() {
59*67e74705SXin Li         y = 0;
60*67e74705SXin Li       }
61*67e74705SXin Li     }
62*67e74705SXin Li   }
63*67e74705SXin Li }
64*67e74705SXin Li 
65*67e74705SXin Li namespace B {} // expected-error {{redefinition of 'B' as different kind of symbol}}
66*67e74705SXin Li 
67*67e74705SXin Li 
68*67e74705SXin Li namespace foo {
69*67e74705SXin Li   enum x {
70*67e74705SXin Li     Y
71*67e74705SXin Li   };
72*67e74705SXin Li }
73*67e74705SXin Li 
74*67e74705SXin Li static foo::x  test1;  // ok
75*67e74705SXin Li 
76*67e74705SXin Li static foo::X  test2;  // typo: expected-error {{no type named 'X' in}}
77*67e74705SXin Li 
78*67e74705SXin Li namespace PR6620 {
79*67e74705SXin Li   namespace numeric {
80*67e74705SXin Li     namespace op {
81*67e74705SXin Li       struct greater {};
82*67e74705SXin Li     }
83*67e74705SXin Li     namespace {
84*67e74705SXin Li       extern op::greater const greater;
85*67e74705SXin Li     }
86*67e74705SXin Li   }
87*67e74705SXin Li 
88*67e74705SXin Li   namespace numeric {
89*67e74705SXin Li     namespace {
90*67e74705SXin Li       op::greater const greater = op::greater();
91*67e74705SXin Li     }
92*67e74705SXin Li 
93*67e74705SXin Li     template<typename T, typename U>
f(T & l,U & r)94*67e74705SXin Li     int f(T& l, U& r)
95*67e74705SXin Li     { numeric::greater(l, r); }
96*67e74705SXin Li 
97*67e74705SXin Li   }
98*67e74705SXin Li }
99