119 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s2 3// Fun things you can do with inline namespaces:4 5inline namespace X {6 void f1(); // expected-note {{'f1' declared here}}7 8 inline namespace Y {9 void f2();10 11 template <typename T> class C {};12 }13 14 // Specialize and partially specialize somewhere else.15 template <> class C<int> {};16 template <typename T> class C<T*> {};17}18 19// Qualified and unqualified lookup as if member of enclosing NS.20void foo1() {21 f1();22 ::f1();23 X::f1();24 Y::f1(); // expected-error {{no member named 'f1' in namespace 'Y'; did you mean simply 'f1'?}}25 26 f2();27 ::f2();28 X::f2();29 Y::f2();30}31 32template <> class C<float> {};33template <typename T> class C<T&> {};34 35template class C<double>;36 37 38// As well as all the fun with ADL.39 40namespace ADL {41 struct Outer {};42 43 inline namespace IL {44 struct Inner {};45 46 void fo(Outer);47 }48 49 void fi(Inner);50 51 inline namespace IL2 {52 void fi2(Inner);53 }54}55 56void foo2() {57 ADL::Outer o;58 ADL::Inner i;59 fo(o);60 fi(i);61 fi2(i);62}63 64// Let's not forget overload sets.65struct Distinct {};66inline namespace Over {67 void over(Distinct);68}69void over(int);70 71void foo3() {72 Distinct d;73 ::over(d);74}75 76// Don't forget to do correct lookup for redeclarations.77namespace redecl { inline namespace n1 {78 79 template <class Tp> class allocator;80 81 template <>82 class allocator<void>83 {84 public:85 typedef const void* const_pointer;86 };87 88 template <class Tp>89 class allocator90 {91 public:92 typedef Tp& reference;93 94 void allocate(allocator<void>::const_pointer = 0);95 };96 97} }98 99// Normal redeclarations (not for explicit instantiations or100// specializations) are distinct in an inline namespace vs. not in an101// inline namespace.102namespace redecl2 { 103 inline namespace n1 {104 void f(int) { }105 struct X1 { };106 template<typename T> void f(T) { }107 template<typename T> struct X2 { };108 int i = 71;109 enum E { e };110 }111 112 void f(int) { }113 struct X1 { };114 template<typename T> void f(T) { }115 template<typename T> struct X2 { };116 int i = 71;117 enum E { e };118}119