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