forked from OSchip/llvm-project
99 lines
2.4 KiB
C++
99 lines
2.4 KiB
C++
// 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();
|
|
} |