1af2d11b1SIain Sandoe // RUN: rm -rf %t 2af2d11b1SIain Sandoe // RUN: mkdir -p %t 3af2d11b1SIain Sandoe // RUN: split-file %s %t 4af2d11b1SIain Sandoe // RUN: cd %t 5af2d11b1SIain Sandoe // 6af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h1.h -emit-header-unit -o h1.pcm 7af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h2.h -emit-header-unit -o h2.pcm 8af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h3.h -emit-header-unit -o h3.pcm 9af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h4.h -emit-header-unit -o h4.pcm 10af2d11b1SIain Sandoe 117e59223aSFangrui Song // RUN: %clang_cc1 -std=c++20 Xlate.cpp -o Xlate.pcm \ 12af2d11b1SIain Sandoe // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \ 13381fcaa1SVolodymyr Sapsai // RUN: -fmodule-file=h4.pcm -fsyntax-only -Rmodule-include-translation -verify 14af2d11b1SIain Sandoe 15af2d11b1SIain Sandoe // Check that we do the intended translation and not more. 16af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 Xlate.cpp \ 17af2d11b1SIain Sandoe // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \ 18af2d11b1SIain Sandoe // RUN: -fmodule-file=h4.pcm -E -undef | FileCheck %s 19af2d11b1SIain Sandoe 20af2d11b1SIain Sandoe // We expect no diagnostics here, the used functions should all be available. 217e59223aSFangrui Song // RUN: %clang_cc1 -std=c++20 Xlate.cpp \ 22af2d11b1SIain Sandoe // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \ 23af2d11b1SIain Sandoe // RUN: -fmodule-file=h4.pcm -fsyntax-only 24af2d11b1SIain Sandoe 25af2d11b1SIain Sandoe // The content of the headers is not terribly important, we just want to check 26af2d11b1SIain Sandoe // whether they are textually included or include-translated. 27af2d11b1SIain Sandoe //--- h1.h 28af2d11b1SIain Sandoe #ifndef H1_GUARD 29af2d11b1SIain Sandoe #define H1_GUARD 30af2d11b1SIain Sandoe 31af2d11b1SIain Sandoe #define ONE 1 32af2d11b1SIain Sandoe 33af2d11b1SIain Sandoe void foo(); 34af2d11b1SIain Sandoe 35af2d11b1SIain Sandoe #endif // H1_GUARD 36af2d11b1SIain Sandoe 37af2d11b1SIain Sandoe //--- h2.h 38af2d11b1SIain Sandoe #ifndef H2_GUARD 39af2d11b1SIain Sandoe #define H2_GUARD 40af2d11b1SIain Sandoe 41af2d11b1SIain Sandoe #define TWO 2 42af2d11b1SIain Sandoe 43af2d11b1SIain Sandoe void bar(); 44af2d11b1SIain Sandoe 45af2d11b1SIain Sandoe #endif // H2_GUARD 46af2d11b1SIain Sandoe 47af2d11b1SIain Sandoe //--- h3.h 48af2d11b1SIain Sandoe #ifndef H3_GUARD 49af2d11b1SIain Sandoe #define H3_GUARD 50af2d11b1SIain Sandoe 51af2d11b1SIain Sandoe #define THREE 3 52af2d11b1SIain Sandoe 53af2d11b1SIain Sandoe void baz(); 54af2d11b1SIain Sandoe 55af2d11b1SIain Sandoe #endif // H3_GUARD 56af2d11b1SIain Sandoe 57af2d11b1SIain Sandoe //--- h4.h 58af2d11b1SIain Sandoe #ifndef H4_GUARD 59af2d11b1SIain Sandoe #define H4_GUARD 60af2d11b1SIain Sandoe 61af2d11b1SIain Sandoe #define FOUR 4 62af2d11b1SIain Sandoe 63af2d11b1SIain Sandoe void boo(); 64af2d11b1SIain Sandoe 65af2d11b1SIain Sandoe #endif // H4_GUARD 66af2d11b1SIain Sandoe 67af2d11b1SIain Sandoe //--- h5.h 68af2d11b1SIain Sandoe #ifndef H5_GUARD 69af2d11b1SIain Sandoe #define H5_GUARD 70af2d11b1SIain Sandoe 71af2d11b1SIain Sandoe #define FIVE 5 72af2d11b1SIain Sandoe 73af2d11b1SIain Sandoe void five(); 74af2d11b1SIain Sandoe 75af2d11b1SIain Sandoe #endif // H4_GUARD 76af2d11b1SIain Sandoe 77af2d11b1SIain Sandoe //--- Xlate.cpp 78af2d11b1SIain Sandoe /* some comment ... 79af2d11b1SIain Sandoe ... */ 80af2d11b1SIain Sandoe module /*nothing here*/; 81af2d11b1SIain Sandoe 82af2d11b1SIain Sandoe // This should be include-translated, when the header unit for h1 is available. 83fc89e904SChuanqi Xu // expected-warning@+1 {{the implementation of header units is in an experimental phase}} 845523fefbSJan Svoboda #include "h1.h" // expected-remark-re {{treating #include as an import of module '.{{/|\\\\?}}h1.h'}} 85af2d11b1SIain Sandoe // Import of a header unit is allowed, named modules are not. 86fc89e904SChuanqi Xu import "h2.h"; // expected-warning {{the implementation of header units is in an experimental phase}} 87af2d11b1SIain Sandoe // A regular, untranslated, header 88af2d11b1SIain Sandoe #include "h5.h" 89af2d11b1SIain Sandoe 90af2d11b1SIain Sandoe export module Xlate; 91af2d11b1SIain Sandoe 92af2d11b1SIain Sandoe // This is OK, the import immediately follows the module decl. 93fc89e904SChuanqi Xu import "h3.h"; // expected-warning {{the implementation of header units is in an experimental phase}} 94af2d11b1SIain Sandoe 95af2d11b1SIain Sandoe // This should *not* be include-translated, even if header unit for h4 is 96af2d11b1SIain Sandoe // available. 97af2d11b1SIain Sandoe #include "h4.h" 98af2d11b1SIain Sandoe 99af2d11b1SIain Sandoe export void charlie() { 100af2d11b1SIain Sandoe foo(); 101af2d11b1SIain Sandoe bar(); 102af2d11b1SIain Sandoe baz(); 103af2d11b1SIain Sandoe boo(); 104af2d11b1SIain Sandoe five(); 105af2d11b1SIain Sandoe } 106af2d11b1SIain Sandoe 1075523fefbSJan Svoboda // CHECK: #pragma clang module import ".{{/|\\\\?}}h1.h" 108*0b7e8c25SDmitry Polukhin // CHECK: import ".{{/|\\\\?}}h2.h" 109*0b7e8c25SDmitry Polukhin // CHECK: import ".{{/|\\\\?}}h3.h" 1105523fefbSJan Svoboda // CHECK-NOT: #pragma clang module import ".{{/|\\\\?}}h4.h" 111