1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace Ns {
344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  int f(); // expected-note{{previous declaration is here}}
4074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
5074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor  enum E {
6074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor    Enumerator
7074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor  };
844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace Ns {
1044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  double f(); // expected-error{{functions that differ only in their return type cannot be overloaded}}
11074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
12074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor  int x = Enumerator;
1344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
1444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
1544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace Ns2 {
1644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  float f();
1744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
1844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
19074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregorint y = Ns::Enumerator;
20074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
2144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace Ns2 {
2244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  float f(int); // expected-note{{previous declaration is here}}
2344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
2444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
2544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace Ns2 {
2644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  double f(int); // expected-error{{functions that differ only in their return type cannot be overloaded}}
2744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
2844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
2944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace N {
3044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  int& f1();
3144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
3244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
3344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace N {
3444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  struct f1 {
3544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    static int member;
36518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor
37518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor    typedef int type;
38518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor
39518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor    void foo(type);
4044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  };
4144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
4244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  void test_f1() {
4344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    int &i1 = f1();
4444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  }
4544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
4644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
470b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid N::f1::foo(int i) {
480b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  f1::member = i;
490b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  f1::type &ir = i;
500b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
51518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor
5244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregornamespace N {
53518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor  float& f1(int x) {
54518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor    N::f1::type& i1 = x;
55eb11cd078ba8682bbb9b082f8f6ead8be5c98581Douglas Gregor    f1::type& i2 = x;
56518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor  }
5744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
5844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  struct f2 {
5944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor    static int member;
6044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  };
6144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  void f2();
6244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
6344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
6444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorint i1 = N::f1::member;
6544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregortypedef struct N::f1 type1;
6644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorint i2 = N::f2::member;
6744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregortypedef struct N::f2 type2;
6844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
6944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid test_f1(int i) {
7044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  int &v1 = N::f1();
7144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  float &v2 = N::f1(i);
72a67865c64e2185817703b602ec24163b286abaabChris Lattner  int v3 = ::i1;
731a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor  int v4 = N::f1::member;
7444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
75a67865c64e2185817703b602ec24163b286abaabChris Lattner
7683cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattnertypedef int f2_type;
7783cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattnernamespace a {
7883cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner  typedef int f2_type(int, int);
7983cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner
8083cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner  void test_f2() {
8119311e70edaa2d7bb0d709344aebea4fbbae2da4Douglas Gregor    ::f2_type(1, 2); // expected-error {{excess elements in scalar initializer}}
8283cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner  }
8383cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner}
8483cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner
85bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor// PR clang/3291
86bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregornamespace a {
87bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor  namespace a {   // A1
88bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor    namespace a { // A2
896e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrain      int i; // expected-note{{'a::a::a::i' declared here}}
90bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor    }
91bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor  }
92bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor}
9383cf05a3b0e655dc8ea1cb4c4e1eef541b770992Chris Lattner
94bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregorvoid test_a() {
956e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrain  a::a::i = 3; // expected-error{{no member named 'i' in namespace 'a::a'; did you mean 'a::a::a::i'?}}
96bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor  a::a::a::i = 4;
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a::a::j = 3; // expected-error-re{{no member named 'j' in namespace 'a::a'{{$}}}}
98bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor}
99bc468ba19c0bad9bf4a40ff39d8fad7e471bfbf5Douglas Gregor
1007c2342dd4c9947806842e5aca3d2bb2e542853c9John McCallstruct Undef { // expected-note{{definition of 'Undef' is not complete until the closing '}'}}
1010b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  typedef int type;
1020b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
1030b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  Undef::type member;
1040b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
1057c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  static int size = sizeof(Undef); // expected-error{{invalid application of 'sizeof' to an incomplete type 'Undef'}}
1060b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
1070b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  int f();
1080b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor};
1090b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
1100b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorint Undef::f() {
1110b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  return sizeof(Undef);
1120b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
113336e7743b8e2222d8557e2cf7c100c8f878df630John McCall
114336e7743b8e2222d8557e2cf7c100c8f878df630John McCall// PR clang/5667
115336e7743b8e2222d8557e2cf7c100c8f878df630John McCallnamespace test1 {
116336e7743b8e2222d8557e2cf7c100c8f878df630John McCall  template <typename T> struct is_class {
117336e7743b8e2222d8557e2cf7c100c8f878df630John McCall    enum { value = 0 };
118336e7743b8e2222d8557e2cf7c100c8f878df630John McCall  };
119336e7743b8e2222d8557e2cf7c100c8f878df630John McCall
120336e7743b8e2222d8557e2cf7c100c8f878df630John McCall  template <typename T> class ClassChecker {
121336e7743b8e2222d8557e2cf7c100c8f878df630John McCall    bool isClass() {
122336e7743b8e2222d8557e2cf7c100c8f878df630John McCall      return is_class<T>::value;
123336e7743b8e2222d8557e2cf7c100c8f878df630John McCall    }
124336e7743b8e2222d8557e2cf7c100c8f878df630John McCall  };
125336e7743b8e2222d8557e2cf7c100c8f878df630John McCall
126336e7743b8e2222d8557e2cf7c100c8f878df630John McCall  template class ClassChecker<int>;
127336e7743b8e2222d8557e2cf7c100c8f878df630John McCall}
1284074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor
1294074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregornamespace PR6830 {
1304074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  namespace foo {
1314074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor
1324074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor    class X {
1334074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor    public:
1344074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor      X() {}
1354074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor    };
1364074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor
1374074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  }  // namespace foo
1384074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor
1394074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  class Z {
1404074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  public:
1414074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor    explicit Z(const foo::X& x) {}
1424074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor
1434074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor    void Work() {}
1444074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  };
1454074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor
1464074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  void Test() {
1474074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor    Z(foo::X()).Work();
1484074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor  }
1494074eefc4c2dc0c554f2e79f7114b309053f9885Douglas Gregor}
150173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky
151173a37a57b79bd8f94b85c2273039e760b159922Nick Lewyckynamespace pr12339 {
152aa71567ba4b8a10e9a7d668bf93e35413d7260a8David Majnemer  extern "C" void i; // expected-error{{variable has incomplete type 'void'}}
153173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky  pr12339::FOO  // expected-error{{no type named 'FOO' in namespace 'pr12339'}}
154173a37a57b79bd8f94b85c2273039e760b159922Nick Lewycky}  // expected-error{{expected unqualified-id}}
155