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 Brawnint 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 Brawnint Test4() { return 0; } 45*6244e384SJohn Brawn test4_fn()46*6244e384SJohn Brawnint 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 BrawnNoSuchType Test5() { return 0; } // expected-error {{unknown type name 'NoSuchType'}} 55*6244e384SJohn Brawn test5_fn()56*6244e384SJohn BrawnTest5 test5_fn() { 57*6244e384SJohn Brawn Test5 x; 58*6244e384SJohn Brawn return x; 59*6244e384SJohn Brawn } 60