1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li namespace Ns { 3*67e74705SXin Li int f(); // expected-note{{previous declaration is here}} 4*67e74705SXin Li 5*67e74705SXin Li enum E { 6*67e74705SXin Li Enumerator 7*67e74705SXin Li }; 8*67e74705SXin Li } 9*67e74705SXin Li namespace Ns { 10*67e74705SXin Li double f(); // expected-error{{functions that differ only in their return type cannot be overloaded}} 11*67e74705SXin Li 12*67e74705SXin Li int x = Enumerator; 13*67e74705SXin Li } 14*67e74705SXin Li 15*67e74705SXin Li namespace Ns2 { 16*67e74705SXin Li float f(); 17*67e74705SXin Li } 18*67e74705SXin Li 19*67e74705SXin Li int y = Ns::Enumerator; 20*67e74705SXin Li 21*67e74705SXin Li namespace Ns2 { 22*67e74705SXin Li float f(int); // expected-note{{previous declaration is here}} 23*67e74705SXin Li } 24*67e74705SXin Li 25*67e74705SXin Li namespace Ns2 { 26*67e74705SXin Li double f(int); // expected-error{{functions that differ only in their return type cannot be overloaded}} 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li namespace N { 30*67e74705SXin Li int& f1(); 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li namespace N { 34*67e74705SXin Li struct f1 { 35*67e74705SXin Li static int member; 36*67e74705SXin Li 37*67e74705SXin Li typedef int type; 38*67e74705SXin Li 39*67e74705SXin Li void foo(type); 40*67e74705SXin Li }; 41*67e74705SXin Li test_f1()42*67e74705SXin Li void test_f1() { 43*67e74705SXin Li int &i1 = f1(); 44*67e74705SXin Li } 45*67e74705SXin Li } 46*67e74705SXin Li foo(int i)47*67e74705SXin Livoid N::f1::foo(int i) { 48*67e74705SXin Li f1::member = i; 49*67e74705SXin Li f1::type &ir = i; 50*67e74705SXin Li } 51*67e74705SXin Li 52*67e74705SXin Li namespace N { f1(int x)53*67e74705SXin Li float& f1(int x) { 54*67e74705SXin Li N::f1::type& i1 = x; 55*67e74705SXin Li f1::type& i2 = x; 56*67e74705SXin Li } 57*67e74705SXin Li 58*67e74705SXin Li struct f2 { 59*67e74705SXin Li static int member; 60*67e74705SXin Li }; 61*67e74705SXin Li void f2(); 62*67e74705SXin Li } 63*67e74705SXin Li 64*67e74705SXin Li int i1 = N::f1::member; 65*67e74705SXin Li typedef struct N::f1 type1; 66*67e74705SXin Li int i2 = N::f2::member; 67*67e74705SXin Li typedef struct N::f2 type2; 68*67e74705SXin Li test_f1(int i)69*67e74705SXin Livoid test_f1(int i) { 70*67e74705SXin Li int &v1 = N::f1(); 71*67e74705SXin Li float &v2 = N::f1(i); 72*67e74705SXin Li int v3 = ::i1; 73*67e74705SXin Li int v4 = N::f1::member; 74*67e74705SXin Li } 75*67e74705SXin Li 76*67e74705SXin Li typedef int f2_type; 77*67e74705SXin Li namespace a { 78*67e74705SXin Li typedef int f2_type(int, int); 79*67e74705SXin Li test_f2()80*67e74705SXin Li void test_f2() { 81*67e74705SXin Li ::f2_type(1, 2); // expected-error {{excess elements in scalar initializer}} 82*67e74705SXin Li } 83*67e74705SXin Li } 84*67e74705SXin Li 85*67e74705SXin Li // PR clang/3291 86*67e74705SXin Li namespace a { 87*67e74705SXin Li namespace a { // A1 88*67e74705SXin Li namespace a { // A2 89*67e74705SXin Li int i; // expected-note{{'a::a::a::i' declared here}} 90*67e74705SXin Li } 91*67e74705SXin Li } 92*67e74705SXin Li } 93*67e74705SXin Li test_a()94*67e74705SXin Livoid test_a() { 95*67e74705SXin Li a::a::i = 3; // expected-error{{no member named 'i' in namespace 'a::a'; did you mean 'a::a::a::i'?}} 96*67e74705SXin Li a::a::a::i = 4; 97*67e74705SXin Li a::a::j = 3; // expected-error-re{{no member named 'j' in namespace 'a::a'{{$}}}} 98*67e74705SXin Li } 99*67e74705SXin Li 100*67e74705SXin Li struct Undef { // expected-note{{definition of 'Undef' is not complete until the closing '}'}} 101*67e74705SXin Li typedef int type; 102*67e74705SXin Li 103*67e74705SXin Li Undef::type member; 104*67e74705SXin Li 105*67e74705SXin Li static int size = sizeof(Undef); // expected-error{{invalid application of 'sizeof' to an incomplete type 'Undef'}} 106*67e74705SXin Li 107*67e74705SXin Li int f(); 108*67e74705SXin Li }; 109*67e74705SXin Li f()110*67e74705SXin Liint Undef::f() { 111*67e74705SXin Li return sizeof(Undef); 112*67e74705SXin Li } 113*67e74705SXin Li 114*67e74705SXin Li // PR clang/5667 115*67e74705SXin Li namespace test1 { 116*67e74705SXin Li template <typename T> struct is_class { 117*67e74705SXin Li enum { value = 0 }; 118*67e74705SXin Li }; 119*67e74705SXin Li 120*67e74705SXin Li template <typename T> class ClassChecker { isClass()121*67e74705SXin Li bool isClass() { 122*67e74705SXin Li return is_class<T>::value; 123*67e74705SXin Li } 124*67e74705SXin Li }; 125*67e74705SXin Li 126*67e74705SXin Li template class ClassChecker<int>; 127*67e74705SXin Li } 128*67e74705SXin Li 129*67e74705SXin Li namespace PR6830 { 130*67e74705SXin Li namespace foo { 131*67e74705SXin Li 132*67e74705SXin Li class X { 133*67e74705SXin Li public: X()134*67e74705SXin Li X() {} 135*67e74705SXin Li }; 136*67e74705SXin Li 137*67e74705SXin Li } // namespace foo 138*67e74705SXin Li 139*67e74705SXin Li class Z { 140*67e74705SXin Li public: Z(const foo::X & x)141*67e74705SXin Li explicit Z(const foo::X& x) {} 142*67e74705SXin Li Work()143*67e74705SXin Li void Work() {} 144*67e74705SXin Li }; 145*67e74705SXin Li Test()146*67e74705SXin Li void Test() { 147*67e74705SXin Li Z(foo::X()).Work(); 148*67e74705SXin Li } 149*67e74705SXin Li } 150*67e74705SXin Li 151*67e74705SXin Li namespace pr12339 { 152*67e74705SXin Li extern "C" void i; // expected-error{{variable has incomplete type 'void'}} 153*67e74705SXin Li pr12339::FOO // expected-error{{no type named 'FOO' in namespace 'pr12339'}} 154*67e74705SXin Li } // expected-error{{expected unqualified-id}} 155