injected-class-name.cpp revision 2fc1bb76e719d0620b4a6e2134413933b21ca6b6
1b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s 2b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 3b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// Check for declaration matching with out-of-line declarations and 4b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// variadic templates, which involves proper computation of the 5b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor// injected-class-name. 6b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 7b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0 { 8b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor typedef T type; 9b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 10b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor void f0(T); 11b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor type f1(T); 12b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor}; 13b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 14b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 15b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, Types...>::f0(T) { } 16b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 17b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 18b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, Types...>::type X0<T, Types...>::f1(T) { } 19b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 20b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 21b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...> { 22b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor typedef T* result; 23b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor result f3(); 24b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 25b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor template<typename... InnerTypes> 26b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor struct Inner; 27b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor}; 28b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 29b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 30b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortypename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; } 31b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 32b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 33b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes> 34b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorstruct X0<T, T, Types...>::Inner { 35b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor template<typename ...ReallyInner> void f4(); 36b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor}; 37b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 38b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename T, typename ...Types> 39b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...InnerTypes> 40b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregortemplate<typename ...ReallyInner> 41b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregorvoid X0<T, T, Types...>::Inner<InnerTypes...>::f4() { } 422fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 432fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregornamespace rdar8848837 { 442fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor // Out-of-line definitions that cause rebuilding in the current 452fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor // instantiation. 462fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor template<typename F> struct X; 472fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 482fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor template<typename R, typename ...ArgTypes> 492fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor struct X<R(ArgTypes...)> { 502fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor X<R(ArgTypes...)> f(); 512fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor }; 522fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 532fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor template<typename R, typename ...ArgTypes> 542fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; } 552fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 562fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 572fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor X<int(float, double)> xif; 582fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor 592fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor} 60