| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| // expected-no-diagnostics |
| |
| // Check for declaration matching with out-of-line declarations and |
| // variadic templates, which involves proper computation of the |
| // injected-class-name. |
| template<typename T, typename ...Types> |
| struct X0 { |
| typedef T type; |
| |
| void f0(T); |
| type f1(T); |
| }; |
| |
| template<typename T, typename ...Types> |
| void X0<T, Types...>::f0(T) { } |
| |
| template<typename T, typename ...Types> |
| typename X0<T, Types...>::type X0<T, Types...>::f1(T) { } |
| |
| template<typename T, typename ...Types> |
| struct X0<T, T, Types...> { |
| typedef T* result; |
| result f3(); |
| |
| template<typename... InnerTypes> |
| struct Inner; |
| }; |
| |
| template<typename T, typename ...Types> |
| typename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; } |
| |
| template<typename T, typename ...Types> |
| template<typename ...InnerTypes> |
| struct X0<T, T, Types...>::Inner { |
| template<typename ...ReallyInner> void f4(); |
| }; |
| |
| template<typename T, typename ...Types> |
| template<typename ...InnerTypes> |
| template<typename ...ReallyInner> |
| void X0<T, T, Types...>::Inner<InnerTypes...>::f4() { } |
| |
| namespace rdar8848837 { |
| // Out-of-line definitions that cause rebuilding in the current |
| // instantiation. |
| template<typename F> struct X; |
| |
| template<typename R, typename ...ArgTypes> |
| struct X<R(ArgTypes...)> { |
| X<R(ArgTypes...)> f(); |
| }; |
| |
| template<typename R, typename ...ArgTypes> |
| X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; } |
| |
| |
| X<int(float, double)> xif; |
| |
| template<unsigned> struct unsigned_c { }; |
| template<typename ...ArgTypes> int g(ArgTypes...); |
| |
| template<typename F> struct X1; |
| |
| template<typename R, typename ...ArgTypes> |
| struct X1<R(ArgTypes...)> { |
| unsigned_c<sizeof(1 + g(ArgTypes()...))> f(); |
| }; |
| |
| template<typename R, typename ...ArgTypes> |
| unsigned_c<sizeof(1 + g(ArgTypes()...))> X1<R(ArgTypes...)>::f() { |
| return unsigned_c<sizeof(int)>(); |
| } |
| |
| X1<int(float, double)> xif2; |
| } |