1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics 3b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 4b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// Check for declaration matching with out-of-line declarations and 5b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// variadic templates, which involves proper computation of the 6b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// injected-class-name. 7b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 8b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0 { 9b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor typedef T type; 10b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 11b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor void f0(T); 12b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor type f1(T); 13b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor}; 14b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 15b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 16b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, Types...>::f0(T) { } 17b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 18b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 19b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, Types...>::type X0<T, Types...>::f1(T) { } 20b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 21b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 22b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...> { 23b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor typedef T* result; 24b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor result f3(); 25b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 26b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor template<typename... InnerTypes> 27b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor struct Inner; 28b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor}; 29b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 30b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 31b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; } 32b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 33b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 34b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes> 35b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...>::Inner { 36b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor template<typename ...ReallyInner> void f4(); 37b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor}; 38b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 39b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 40b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes> 41b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...ReallyInner> 42b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, T, Types...>::Inner<InnerTypes...>::f4() { } 432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregornamespace rdar8848837 { 452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor // Out-of-line definitions that cause rebuilding in the current 462fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor // instantiation. 472fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor template<typename F> struct X; 482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor template<typename R, typename ...ArgTypes> 502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor struct X<R(ArgTypes...)> { 512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor X<R(ArgTypes...)> f(); 522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor }; 532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor template<typename R, typename ...ArgTypes> 552fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; } 562fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 572fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 582fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor X<int(float, double)> xif; 592fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 604f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor template<unsigned> struct unsigned_c { }; 614f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor template<typename ...ArgTypes> int g(ArgTypes...); 624f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 634f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor template<typename F> struct X1; 644f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 654f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor template<typename R, typename ...ArgTypes> 664f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor struct X1<R(ArgTypes...)> { 674f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor unsigned_c<sizeof(1 + g(ArgTypes()...))> f(); 684f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor }; 694f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 704f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor template<typename R, typename ...ArgTypes> 714f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor unsigned_c<sizeof(1 + g(ArgTypes()...))> X1<R(ArgTypes...)>::f() { 724f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor return unsigned_c<sizeof(int)>(); 734f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor } 744f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor 754f1d282d6f32a419e89ddb56342e2313b0c78bb7Douglas Gregor X1<int(float, double)> xif2; 762fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor} 77