injected-class-name.cpp revision b7d09d627c8576b9bc85f44f05befdd44fedc7ed
1// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s 2 3// Check for declaration matching with out-of-line declarations and 4// variadic templates, which involves proper computation of the 5// injected-class-name. 6template<typename T, typename ...Types> 7struct X0 { 8 typedef T type; 9 10 void f0(T); 11 type f1(T); 12}; 13 14template<typename T, typename ...Types> 15void X0<T, Types...>::f0(T) { } 16 17template<typename T, typename ...Types> 18typename X0<T, Types...>::type X0<T, Types...>::f1(T) { } 19 20template<typename T, typename ...Types> 21struct X0<T, T, Types...> { 22 typedef T* result; 23 result f3(); 24 25 template<typename... InnerTypes> 26 struct Inner; 27}; 28 29template<typename T, typename ...Types> 30typename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; } 31 32template<typename T, typename ...Types> 33template<typename ...InnerTypes> 34struct X0<T, T, Types...>::Inner { 35 template<typename ...ReallyInner> void f4(); 36}; 37 38template<typename T, typename ...Types> 39template<typename ...InnerTypes> 40template<typename ...ReallyInner> 41void X0<T, T, Types...>::Inner<InnerTypes...>::f4() { } 42