77 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s2// expected-no-diagnostics3 4// Check for declaration matching with out-of-line declarations and5// variadic templates, which involves proper computation of the6// injected-class-name.7template<typename T, typename ...Types>8struct X0 {9 typedef T type;10 11 void f0(T);12 type f1(T);13};14 15template<typename T, typename ...Types>16void X0<T, Types...>::f0(T) { }17 18template<typename T, typename ...Types>19typename X0<T, Types...>::type X0<T, Types...>::f1(T) { }20 21template<typename T, typename ...Types>22struct X0<T, T, Types...> {23 typedef T* result;24 result f3();25 26 template<typename... InnerTypes>27 struct Inner;28};29 30template<typename T, typename ...Types>31typename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; }32 33template<typename T, typename ...Types>34template<typename ...InnerTypes>35struct X0<T, T, Types...>::Inner {36 template<typename ...ReallyInner> void f4();37};38 39template<typename T, typename ...Types>40template<typename ...InnerTypes>41template<typename ...ReallyInner>42void X0<T, T, Types...>::Inner<InnerTypes...>::f4() { }43 44namespace rdar8848837 {45 // Out-of-line definitions that cause rebuilding in the current46 // instantiation.47 template<typename F> struct X;48 49 template<typename R, typename ...ArgTypes>50 struct X<R(ArgTypes...)> {51 X<R(ArgTypes...)> f();52 };53 54 template<typename R, typename ...ArgTypes>55 X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; }56 57 58 X<int(float, double)> xif;59 60 template<unsigned> struct unsigned_c { };61 template<typename ...ArgTypes> int g(ArgTypes...);62 63 template<typename F> struct X1;64 65 template<typename R, typename ...ArgTypes>66 struct X1<R(ArgTypes...)> {67 unsigned_c<sizeof(1 + g(ArgTypes()...))> f();68 };69 70 template<typename R, typename ...ArgTypes>71 unsigned_c<sizeof(1 + g(ArgTypes()...))> X1<R(ArgTypes...)>::f() { 72 return unsigned_c<sizeof(int)>();73 }74 75 X1<int(float, double)> xif2;76}77