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