// RUN: %clang_cc1 -fsyntax-only -verify %s namespace Ns { int f(); // expected-note{{previous declaration is here}} enum E { Enumerator }; } namespace Ns { double f(); // expected-error{{functions that differ only in their return type cannot be overloaded}} int x = Enumerator; } namespace Ns2 { float f(); } int y = Ns::Enumerator; namespace Ns2 { float f(int); // expected-note{{previous declaration is here}} } namespace Ns2 { double f(int); // expected-error{{functions that differ only in their return type cannot be overloaded}} } namespace N { int& f1(); } namespace N { struct f1 { static int member; typedef int type; void foo(type); }; void test_f1() { int &i1 = f1(); } } void N::f1::foo(int i) { f1::member = i; f1::type &ir = i; } namespace N { float& f1(int x) { N::f1::type& i1 = x; f1::type& i2 = x; } struct f2 { static int member; }; void f2(); } int i1 = N::f1::member; typedef struct N::f1 type1; int i2 = N::f2::member; typedef struct N::f2 type2; void test_f1(int i) { int &v1 = N::f1(); float &v2 = N::f1(i); int v3 = ::i1; int v4 = N::f1::member; } typedef int f2_type; namespace a { typedef int f2_type(int, int); void test_f2() { ::f2_type(1, 2); // expected-error {{excess elements in scalar initializer}} } } // PR clang/3291 namespace a { namespace a { // A1 namespace a { // A2 int i; } } } void test_a() { a::a::i = 3; // expected-error{{no member named 'i'}} a::a::a::i = 4; } struct Undef { // expected-note{{definition of 'Undef' is not complete until the closing '}'}} typedef int type; Undef::type member; static int size = sizeof(Undef); // expected-error{{invalid application of 'sizeof' to an incomplete type 'Undef'}} int f(); }; int Undef::f() { return sizeof(Undef); } // PR clang/5667 namespace test1 { template <typename T> struct is_class { enum { value = 0 }; }; template <typename T> class ClassChecker { bool isClass() { return is_class<T>::value; } }; template class ClassChecker<int>; } namespace PR6830 { namespace foo { class X { public: X() {} }; } // namespace foo class Z { public: explicit Z(const foo::X& x) {} void Work() {} }; void Test() { Z(foo::X()).Work(); } }