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