xref: /llvm-project/clang/test/SemaCXX/invalid-decl-hiding.cpp (revision 6244e3840694e513ef885e8505e7744de8c9b959)
1*6244e384SJohn Brawn // RUN: %clang_cc1 -fsyntax-only -verify %s
2*6244e384SJohn Brawn 
3*6244e384SJohn Brawn // Member Test1 hides class Test1
4*6244e384SJohn Brawn class Test1 {
5*6244e384SJohn Brawn   static int Test1; // expected-error {{member 'Test1' has the same name as its class}}
6*6244e384SJohn Brawn                     // expected-note@-1 {{class 'Test1' is hidden by a non-type declaration of 'Test1' here}}
fn1()7*6244e384SJohn Brawn   void fn1() {
8*6244e384SJohn Brawn     Test1 x; // expected-error {{must use 'class' tag to refer to type 'Test1' in this scope}}
9*6244e384SJohn Brawn   }
fn2()10*6244e384SJohn Brawn   int fn2() {
11*6244e384SJohn Brawn     return Test1;
12*6244e384SJohn Brawn   }
13*6244e384SJohn Brawn };
14*6244e384SJohn Brawn 
15*6244e384SJohn Brawn // Member Test2 doesn't hide class Test2 as its declaration is invalid
16*6244e384SJohn Brawn class Test2 { // expected-note {{declared here}}
17*6244e384SJohn Brawn   static NoSuchType Test2; // expected-error {{unknown type name 'NoSuchType'}}
18*6244e384SJohn Brawn                            // expected-error@-1 {{member 'Test2' has the same name as its class}}
fn1()19*6244e384SJohn Brawn   void fn1() {
20*6244e384SJohn Brawn     Test2 x;
21*6244e384SJohn Brawn   }
fn2()22*6244e384SJohn Brawn   int fn2() {
23*6244e384SJohn Brawn     return Test2; // expected-error {{'Test2' does not refer to a value}}
24*6244e384SJohn Brawn   }
25*6244e384SJohn Brawn };
26*6244e384SJohn Brawn 
27*6244e384SJohn Brawn // Test3a::x doesn't hide Test3b::x as its declaration is invalid
28*6244e384SJohn Brawn namespace Test3a {
x()29*6244e384SJohn Brawn   NoSuchType x() { return 0; } // expected-error {{unknown type name 'NoSuchType'}}
30*6244e384SJohn Brawn }
31*6244e384SJohn Brawn namespace Test3b {
32*6244e384SJohn Brawn   class x; // expected-note {{declared here}}
33*6244e384SJohn Brawn }
34*6244e384SJohn Brawn using Test3a::x;
35*6244e384SJohn Brawn using Test3b::x;
test3_fn()36*6244e384SJohn Brawn int test3_fn() {
37*6244e384SJohn Brawn   return x; // expected-error {{'x' does not refer to a value}}
38*6244e384SJohn Brawn }
39*6244e384SJohn Brawn 
40*6244e384SJohn Brawn // Function Test4 hides class Test4, whose declaration is invalid
41*6244e384SJohn Brawn class Test4 : public NoSuchType { // expected-error {{expected class name}}
42*6244e384SJohn Brawn 
43*6244e384SJohn Brawn };
Test4()44*6244e384SJohn Brawn int Test4() { return 0; }
45*6244e384SJohn Brawn 
test4_fn()46*6244e384SJohn Brawn int test4_fn() {
47*6244e384SJohn Brawn   return Test4();
48*6244e384SJohn Brawn }
49*6244e384SJohn Brawn 
50*6244e384SJohn Brawn // Function Test5 doesn't hide class Test5 when both are invalid
51*6244e384SJohn Brawn class Test5 : public NoSuchType { // expected-error {{expected class name}}
52*6244e384SJohn Brawn 
53*6244e384SJohn Brawn };
Test5()54*6244e384SJohn Brawn NoSuchType Test5() { return 0; } // expected-error {{unknown type name 'NoSuchType'}}
55*6244e384SJohn Brawn 
test5_fn()56*6244e384SJohn Brawn Test5 test5_fn() {
57*6244e384SJohn Brawn   Test5 x;
58*6244e384SJohn Brawn   return x;
59*6244e384SJohn Brawn }
60