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