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