1df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie
3df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie// The nested-name-specifier of a qualified declarator-id shall not begin with a decltype-specifier.
4df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikieclass foo {
5df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie  static int i;
6df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie  void func();
7df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie};
8df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie
9df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikieint decltype(foo())::i; // expected-error{{'decltype' cannot be used to name a declaration}}
10df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikievoid decltype(foo())::func() { // expected-error{{'decltype' cannot be used to name a declaration}}
11df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie}
12df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie
13df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie
14df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikietemplate<typename T>
15df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikieclass tfoo {
16df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie  static int i;
17df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie  void func();
18df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie};
19df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie
20df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikietemplate<typename T>
2176178ed0911797175b13ac733c390233f02bb841David Blaikieint decltype(tfoo<T>())::i; // expected-error{{nested name specifier 'decltype(tfoo<T>())::' for declaration does not refer into a class, class template or class template partial specialization}}
22df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikietemplate<typename T>
2376178ed0911797175b13ac733c390233f02bb841David Blaikievoid decltype(tfoo<T>())::func() { // expected-error{{nested name specifier 'decltype(tfoo<T>())::' for declaration does not refer into a class, class template or class template partial specialization}}
24df512bfbc4b8c00202ea7a8c900c59ec55890676David Blaikie}
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// An init-declarator named with a qualified-id can refer to an element of the
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// inline namespace set of the named namespace.
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace inline_namespaces {
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N {
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    inline namespace M {
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      void f(); // expected-note {{possible target}}
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      void g();
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      extern int m; // expected-note {{candidate}}
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      extern int n;
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      struct S; // expected-note {{candidate}}
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      struct T;
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      enum E : int; // expected-note {{candidate}}
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      enum F : int;
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename T> void ft(); // expected-note {{here}}
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename T> void gt(); // expected-note {{here}}
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename T> extern int mt; // expected-note {{here}} expected-warning {{extension}}
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename T> extern int nt; // expected-note {{here}} expected-warning {{extension}}
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename T> struct U; // expected-note {{here}}
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename T> struct V; // expected-note {{here}}
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // When named by unqualified-id, we do *not* look in the inline namespace
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // set.
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f() {} // expected-note {{possible target}}
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int m; // expected-note {{candidate}}
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct S {}; // expected-note {{candidate}}
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    enum E : int {}; // expected-note {{candidate}}
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static_assert(&f != &M::f, ""); // expected-error {{reference to overloaded function could not be resolved}}
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static_assert(&m != &M::m, ""); // expected-error {{ambiguous}}
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef S X; // expected-error {{ambiguous}}
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef E Y; // expected-error {{ambiguous}}
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // When named by (unqualified) template-id, we do look in the inline
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // namespace set.  See [namespace.def]p8, [temp.explicit]p3,
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // [temp.expl.spec]p2.
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // This is not explicitly specified for partial specializations, but
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // that is just a language defect.
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> void ft<int>() {}
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template void ft<char>(); // expected-error {{undefined}}
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    template<typename T> int mt<T*>;
696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    template<> int mt<int>;
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template int mt<int*>;
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template int mt<char>; // expected-error {{undefined}}
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct U<T*> {};
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> struct U<int> {};
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template struct U<int*>;
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template struct U<char>; // expected-error {{undefined}}
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // When named by qualified-id, we *do* look in the inline namespace set.
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void N::g() {}
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int N::n;
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct N::T {};
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum N::F : int {};
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static_assert(&N::g == &N::M::g, "");
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static_assert(&N::n == &N::M::n, "");
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef N::T X;
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef N::M::T X;
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef N::F Y;
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef N::M::F Y;
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> void N::gt<int>() {}
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void N::gt<char>(); // expected-error {{undefined}}
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> int N::nt<T*>;
966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<> int N::nt<int>;
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template int N::nt<int*>;
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template int N::nt<char>; // expected-error {{undefined}}
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct N::V<T*> {};
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> struct N::V<int> {};
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template struct N::V<int*>;
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template struct N::V<char>; // expected-error {{undefined}}
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
105