injected-class-name.cpp revision 2fc1bb76e719d0620b4a6e2134413933b21ca6b6
1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// Check for declaration matching with out-of-line declarations and 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// variadic templates, which involves proper computation of the 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// injected-class-name. 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct X0 { 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project typedef T type; 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void f0(T); 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project type f1(T); 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}; 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectvoid X0<T, Types...>::f0(T) { } 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttypename X0<T, Types...>::type X0<T, Types...>::f1(T) { } 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct X0<T, T, Types...> { 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project typedef T* result; 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result f3(); 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project template<typename... InnerTypes> 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project struct Inner; 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}; 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttypename X0<T, T, Types...>::result X0<T, T, Types...>::f3() { return 0; } 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename ...InnerTypes> 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct X0<T, T, Types...>::Inner { 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project template<typename ...ReallyInner> void f4(); 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}; 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename T, typename ...Types> 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename ...InnerTypes> 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projecttemplate<typename ...ReallyInner> 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectvoid X0<T, T, Types...>::Inner<InnerTypes...>::f4() { } 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectnamespace rdar8848837 { 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // Out-of-line definitions that cause rebuilding in the current 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // instantiation. 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project template<typename F> struct X; 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project template<typename R, typename ...ArgTypes> 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project struct X<R(ArgTypes...)> { 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project X<R(ArgTypes...)> f(); 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project }; 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project template<typename R, typename ...ArgTypes> 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project X<R(ArgTypes...)> X<R(ArgTypes...)>::f() { return *this; } 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project X<int(float, double)> xif; 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project