C++程序  |  99行  |  2.41 KB

// RUN: %clang_cc1 -std=c++1y -verify %s
// RUN: %clang_cc1 -std=c++1y -verify %s -fdelayed-template-parsing

namespace nested_local_templates_1 {

template <class T> struct Outer {
  template <class U> int outer_mem(T t, U u) {
    struct Inner {
      template <class V> int inner_mem(T t, U u, V v) {
        struct InnerInner {
          template <class W> int inner_inner_mem(W w, T t, U u, V v) {
            return 0;
          }
        };
        InnerInner().inner_inner_mem("abc", t, u, v);
        return 0;
      }
    };
    Inner i;
    i.inner_mem(t, u, 3.14);
    return 0;
  }

  template <class U> int outer_mem(T t, U *u);
};

template int Outer<int>::outer_mem(int, char);

template <class T> template <class U> int Outer<T>::outer_mem(T t, U *u) {
  struct Inner {
    template <class V>
    int inner_mem(T t, U u, V v) { //expected-note{{candidate function}}
      struct InnerInner {
        template <class W> int inner_inner_mem(W w, T t, U u, V v) { return 0; }
      };
      InnerInner().inner_inner_mem("abc", t, u, v);
      return 0;
    }
  };
  Inner i;
  i.inner_mem(t, U{}, i);
  i.inner_mem(t, u, 3.14); //expected-error{{no matching member function for call to 'inner}}
  return 0;
}

template int Outer<int>::outer_mem(int, char *); //expected-note{{in instantiation of function}}

} // end ns

namespace nested_local_templates_2 {

template <class T> struct Outer {
  template <class U> void outer_mem(T t, U u) {
    struct Inner {
      template <class V> struct InnerTemplateClass {
        template <class W>
        void itc_mem(T t, U u, V v, W w) { //expected-note{{candidate function}}
          struct InnerInnerInner {
            template <class X> void iii_mem(X x) {}
          };
          InnerInnerInner i;
          i.iii_mem("abc");
        }
      };
    };
    Inner i;
    typename Inner::template InnerTemplateClass<Inner> ii;
    ii.itc_mem(t, u, i, "jim");
    ii.itc_mem(t, u, 0, "abd"); //expected-error{{no matching member function}}
  }
};

template void
Outer<int>::outer_mem(int, char); //expected-note{{in instantiation of}}

}

namespace more_nested_local_templates {

int test() {
  struct Local {
    template<class U> void foo(U u) {
      struct Inner {
        template<class A> 
        auto operator()(A a, U u2) -> U {
          return u2;
        };
      };
      Inner GL; 
      GL('a', u );
      GL(3.14, u );
    }
  };
  Local l;
  l.foo("nmabc");
  return 0;
}
int t = test();
}