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