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