Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -std=c++1y -verify %s
      2 // RUN: %clang_cc1 -std=c++1y -verify %s -fdelayed-template-parsing
      3 
      4 namespace nested_local_templates_1 {
      5 
      6 template <class T> struct Outer {
      7   template <class U> int outer_mem(T t, U u) {
      8     struct Inner {
      9       template <class V> int inner_mem(T t, U u, V v) {
     10         struct InnerInner {
     11           template <class W> int inner_inner_mem(W w, T t, U u, V v) {
     12             return 0;
     13           }
     14         };
     15         InnerInner().inner_inner_mem("abc", t, u, v);
     16         return 0;
     17       }
     18     };
     19     Inner i;
     20     i.inner_mem(t, u, 3.14);
     21     return 0;
     22   }
     23 
     24   template <class U> int outer_mem(T t, U *u);
     25 };
     26 
     27 template int Outer<int>::outer_mem(int, char);
     28 
     29 template <class T> template <class U> int Outer<T>::outer_mem(T t, U *u) {
     30   struct Inner {
     31     template <class V>
     32     int inner_mem(T t, U u, V v) { //expected-note{{candidate function}}
     33       struct InnerInner {
     34         template <class W> int inner_inner_mem(W w, T t, U u, V v) { return 0; }
     35       };
     36       InnerInner().inner_inner_mem("abc", t, u, v);
     37       return 0;
     38     }
     39   };
     40   Inner i;
     41   i.inner_mem(t, U{}, i);
     42   i.inner_mem(t, u, 3.14); //expected-error{{no matching member function for call to 'inner}}
     43   return 0;
     44 }
     45 
     46 template int Outer<int>::outer_mem(int, char *); //expected-note{{in instantiation of function}}
     47 
     48 } // end ns
     49 
     50 namespace nested_local_templates_2 {
     51 
     52 template <class T> struct Outer {
     53   template <class U> void outer_mem(T t, U u) {
     54     struct Inner {
     55       template <class V> struct InnerTemplateClass {
     56         template <class W>
     57         void itc_mem(T t, U u, V v, W w) { //expected-note{{candidate function}}
     58           struct InnerInnerInner {
     59             template <class X> void iii_mem(X x) {}
     60           };
     61           InnerInnerInner i;
     62           i.iii_mem("abc");
     63         }
     64       };
     65     };
     66     Inner i;
     67     typename Inner::template InnerTemplateClass<Inner> ii;
     68     ii.itc_mem(t, u, i, "jim");
     69     ii.itc_mem(t, u, 0, "abd"); //expected-error{{no matching member function}}
     70   }
     71 };
     72 
     73 template void
     74 Outer<int>::outer_mem(int, char); //expected-note{{in instantiation of}}
     75 
     76 }
     77 
     78 namespace more_nested_local_templates {
     79 
     80 int test() {
     81   struct Local {
     82     template<class U> void foo(U u) {
     83       struct Inner {
     84         template<class A>
     85         auto operator()(A a, U u2) -> U {
     86           return u2;
     87         };
     88       };
     89       Inner GL;
     90       GL('a', u );
     91       GL(3.14, u );
     92     }
     93   };
     94   Local l;
     95   l.foo("nmabc");
     96   return 0;
     97 }
     98 int t = test();
     99 }