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
9e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith// With modules
10e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -fmodules %s -chain-include %s -chain-include %s
11e565bfa2d67a3b5e02412b4fde5b28873ff7b8d8Richard Smith
128e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
138e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs
14220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#ifndef HEADER1
15220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#define HEADER1
16220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
17220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Primary header for C++ chained PCH test
18220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
19220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid f();
20220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
21220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Name not appearing in dependent
22220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid pf();
23220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
24220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricknamespace ns {
25220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void g();
26220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
27220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void pg();
28220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick}
29220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
30220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <typename T>
31220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S { typedef int G; };
32220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
33220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Partially specialize
34220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <typename T>
35220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<T *> { typedef int H; };
36220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
379703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidistemplate <typename T> struct TS2;
389703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidistypedef TS2<int> TS2int;
399703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
40f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssontemplate <typename T> struct TestBaseSpecifiers { };
41f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssontemplate<typename T> struct TestBaseSpecifiers2 : TestBaseSpecifiers<T> { };
42f25330bd88f921b6e4cae965932681f213d9d544Anders Carlsson
43f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redltemplate <typename T>
44f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstruct TS3 {
45f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl  static const int value = 0;
463e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smith  static const int value2;
47f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl};
48f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redltemplate <typename T>
49f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlconst int TS3<T>::value;
503e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smithtemplate <typename T>
513e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smithconst int TS3<T>::value2 = 1;
52f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl// Instantiate struct, but not value.
53f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstruct instantiate : TS3<int> {};
54f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
55a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor// Typedef
56a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregortypedef int Integer;
57f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
58220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
59220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#elif not defined(HEADER2)
60220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#define HEADER2
61f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl#if !defined(HEADER1)
62f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl#error Header inclusion order messed up
63f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl#endif
64f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
65220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
66220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Dependent header for C++ chained PCH test
67220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
68220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Overload function from primary
69220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid f(int);
70220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
71220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Add function with different name
72220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickvoid f2();
73220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
74220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Reopen namespace
75220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricknamespace ns {
76220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  // Overload function from primary
77220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void g(int);
78220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
79220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  // Add different name
80220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick  void g2();
81220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick}
82220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
83220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Specialize template from primary
84220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <>
85220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<int> { typedef int I; };
86220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
87220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Partially specialize
88220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <typename T>
89220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<T &> { typedef int J; };
90220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
91220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Specialize previous partial specialization
92220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <>
93220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<int *> { typedef int K; };
94220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
95220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick// Specialize the partial specialization from this file
96220a9c82dc76a83a7f930879bf176783866c0514Andrew Tricktemplate <>
97220a9c82dc76a83a7f930879bf176783866c0514Andrew Trickstruct S<int &> { typedef int L; };
98220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
999703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidistemplate <typename T> struct TS2 { };
1009703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
101f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssonstruct TestBaseSpecifiers3 { };
102f25330bd88f921b6e4cae965932681f213d9d544Anders Carlssonstruct TestBaseSpecifiers4 : TestBaseSpecifiers3 { };
103f25330bd88f921b6e4cae965932681f213d9d544Anders Carlsson
104c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlssonstruct A { };
105c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlssonstruct B : A { };
106c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
1073e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smith// Instantiate TS3's members.
108f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstatic const int ts3m1 = TS3<int>::value;
1093e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smithextern int arr[TS3<int>::value2];
110f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
111a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor// Redefinition of typedef
112a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregortypedef int Integer;
113a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor
114220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
115220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#else
116220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
117220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
1185967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redlvoid test() {
1195967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  f();
1205967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  f(1);
1215967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  pf();
1225967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  f2();
1235967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
1245967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::g();
1255967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::g(1);
1265967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::pg();
1275967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl  ns::g2();
1285967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl
1294153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<double>::G T1;
1304153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<double *>::H T2;
1314153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<int>::I T3;
1324153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<double &>::J T4;
1334153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<int *>::K T5;
1344153a060f4cd03e9db1349328a158e9d898a2610Sebastian Redl  typedef S<int &>::L T6;
1359703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
1369703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis  TS2int ts2;
137c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
138c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson  B b;
139a1be278c4f3a234ff61f04018d26c6beecde1654Douglas Gregor  Integer i = 17;
1405967d6228f183a5fa384f2f1918df679ed2d8666Sebastian Redl}
141220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick
142f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl// Should have remembered that there is a definition.
143f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redlstatic const int ts3m2 = TS3<int>::value;
1443e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smithint arr[TS3<int>::value2];
145f79a71908d6f28cb2bc0c081d9a801ed14d61d82Sebastian Redl
146220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick//===----------------------------------------------------------------------===//
147220a9c82dc76a83a7f930879bf176783866c0514Andrew Trick#endif
148