brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 3b2c489 Raw
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