15967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl// Test C++ chained PCH functionality
25967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
35967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl// Without PCH
4220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// RUN: %clang_cc1 -fsyntax-only -verify -include %s -include %s %s
55967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
65967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl// With PCH
7b0f4b9a558933b307073f7cd7753602f94354ae9Argyrios Kyrtzidis// RUN: %clang_cc1 -fsyntax-only -verify %s -chain-include %s -chain-include %s
85967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
9220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#ifndef HEADER1
10220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#define HEADER1
11220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
12220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Primary header for C++ chained PCH test
13220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
14220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid f();
15220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
16220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Name not appearing in dependent
17220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid pf();
18220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
19220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricknamespace ns {
20220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void g();
21220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
22220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void pg();
23220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick}
24220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
25220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <typename T>
26220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S { typedef int G; };
27220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
28220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Partially specialize
29220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <typename T>
30220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<T *> { typedef int H; };
31220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
329703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidistemplate <typename T> struct TS2;
339703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidistypedef TS2<int> TS2int;
349703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
35f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssontemplate <typename T> struct TestBaseSpecifiers { };
36f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssontemplate<typename T> struct TestBaseSpecifiers2 : TestBaseSpecifiers<T> { };
37f25330bd88f921b6e4cae965932681f213d9d544Anders Carlsson
38f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redltemplate <typename T>
39f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstruct TS3 {
40f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl  static const int value = 0;
41f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl};
42f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redltemplate <typename T>
43f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlconst int TS3<T>::value;
44f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl// Instantiate struct, but not value.
45f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstruct instantiate : TS3<int> {};
46f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
47f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
48220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
49220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#elif not defined(HEADER2)
50220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#define HEADER2
51f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl#if !defined(HEADER1)
52f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl#error Header inclusion order messed up
53f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl#endif
54f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
55220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
56220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Dependent header for C++ chained PCH test
57220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
58220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Overload function from primary
59220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid f(int);
60220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
61220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Add function with different name
62220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid f2();
63220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
64220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Reopen namespace
65220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricknamespace ns {
66220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  // Overload function from primary
67220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void g(int);
68220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
69220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  // Add different name
70220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void g2();
71220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick}
72220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
73220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Specialize template from primary
74220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <>
75220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<int> { typedef int I; };
76220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
77220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Partially specialize
78220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <typename T>
79220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<T &> { typedef int J; };
80220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
81220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Specialize previous partial specialization
82220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <>
83220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<int *> { typedef int K; };
84220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
85220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Specialize the partial specialization from this file
86220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <>
87220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<int &> { typedef int L; };
88220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
899703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidistemplate <typename T> struct TS2 { };
909703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
91f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssonstruct TestBaseSpecifiers3 { };
92f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssonstruct TestBaseSpecifiers4 : TestBaseSpecifiers3 { };
93f25330bd88f921b6e4cae965932681f213d9d544Anders Carlsson
94c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlssonstruct A { };
95c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlssonstruct B : A { };
96c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
97f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl// Instantiate TS3's member.
98f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstatic const int ts3m1 = TS3<int>::value;
99f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
100220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
101220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#else
102220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
103220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
1045967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redlvoid test() {
1055967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  f();
1065967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  f(1);
1075967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  pf();
1085967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  f2();
1095967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
1105967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::g();
1115967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::g(1);
1125967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::pg();
1135967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::g2();
1145967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
1154153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<double>::G T1;
1164153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<double *>::H T2;
1174153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<int>::I T3;
1184153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<double &>::J T4;
1194153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<int *>::K T5;
1204153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<int &>::L T6;
1219703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
1229703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis  TS2int ts2;
123c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
124c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson  B b;
1255967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl}
126220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
127f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl// Should have remembered that there is a definition.
128f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstatic const int ts3m2 = TS3<int>::value;
129f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
130220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
131220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#endif
132