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
5namespace A { // expected-note 2 {{previous definition is here}}
6  int A;
7  void f() { A = 0; }
8}
9
10void f() { A = 0; } // expected-error {{unexpected namespace name 'A': expected expression}}
11int A; // expected-error {{redefinition of 'A' as different kind of symbol}}
12class A; // expected-error {{redefinition of 'A' as different kind of symbol}}
13
14class 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
20void C(); // expected-note {{previous definition is here}}
21namespace C {} // expected-error {{redefinition of 'C' as different kind of symbol}}
22
23namespace D {
24  class D {};
25}
26
27namespace S1 {
28  int x;
29
30  namespace S2 {
31
32    namespace S3 {
33      B x;
34    }
35  }
36}
37
38namespace S1 {
39  void f() {
40    x = 0;
41  }
42
43  namespace S2 {
44
45    namespace S3 {
46      void f() {
47        x = 0; // expected-error {{no viable overloaded '='}}
48      }
49    }
50
51    int y;
52  }
53}
54
55namespace S1 {
56  namespace S2 {
57    namespace S3 {
58      void f3() {
59        y = 0;
60      }
61    }
62  }
63}
64
65namespace B {} // expected-error {{redefinition of 'B' as different kind of symbol}}
66
67
68namespace foo {
69  enum x {
70    Y
71  };
72}
73
74static foo::x  test1;  // ok
75
76static foo::X  test2;  // typo: expected-error {{no type named 'X' in}}
77
78namespace 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>
94    int f(T& l, U& r)
95    { numeric::greater(l, r); }
96
97  }
98}
99