| // RUN: rm -rf %t |
| // RUN: mkdir -p %t |
| // RUN: split-file %s %t |
| // RUN: cd %t |
| // |
| // RUN: %clang_cc1 -std=c++20 -xc++-user-header h1.h -emit-header-unit -o h1.pcm |
| // RUN: %clang_cc1 -std=c++20 -xc++-user-header h2.h -emit-header-unit -o h2.pcm |
| // RUN: %clang_cc1 -std=c++20 -xc++-user-header h3.h -emit-header-unit -o h3.pcm |
| // RUN: %clang_cc1 -std=c++20 -xc++-user-header h4.h -emit-header-unit -o h4.pcm |
| |
| // RUN: %clang_cc1 -std=c++20 Xlate.cpp -o Xlate.pcm \ |
| // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \ |
| // RUN: -fmodule-file=h4.pcm -fsyntax-only -Rmodule-include-translation -verify |
| |
| // Check that we do the intended translation and not more. |
| // RUN: %clang_cc1 -std=c++20 Xlate.cpp \ |
| // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \ |
| // RUN: -fmodule-file=h4.pcm -E -undef | FileCheck %s |
| |
| // We expect no diagnostics here, the used functions should all be available. |
| // RUN: %clang_cc1 -std=c++20 Xlate.cpp \ |
| // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \ |
| // RUN: -fmodule-file=h4.pcm -fsyntax-only |
| |
| // The content of the headers is not terribly important, we just want to check |
| // whether they are textually included or include-translated. |
| //--- h1.h |
| #ifndef H1_GUARD |
| #define H1_GUARD |
| |
| #define ONE 1 |
| |
| void foo(); |
| |
| #endif // H1_GUARD |
| |
| //--- h2.h |
| #ifndef H2_GUARD |
| #define H2_GUARD |
| |
| #define TWO 2 |
| |
| void bar(); |
| |
| #endif // H2_GUARD |
| |
| //--- h3.h |
| #ifndef H3_GUARD |
| #define H3_GUARD |
| |
| #define THREE 3 |
| |
| void baz(); |
| |
| #endif // H3_GUARD |
| |
| //--- h4.h |
| #ifndef H4_GUARD |
| #define H4_GUARD |
| |
| #define FOUR 4 |
| |
| void boo(); |
| |
| #endif // H4_GUARD |
| |
| //--- h5.h |
| #ifndef H5_GUARD |
| #define H5_GUARD |
| |
| #define FIVE 5 |
| |
| void five(); |
| |
| #endif // H4_GUARD |
| |
| //--- Xlate.cpp |
| /* some comment ... |
| ... */ |
| module /*nothing here*/; |
| |
| // This should be include-translated, when the header unit for h1 is available. |
| // expected-warning@+1 {{the implementation of header units is in an experimental phase}} |
| #include "h1.h" // expected-remark-re {{treating #include as an import of module '.{{/|\\\\?}}h1.h'}} |
| // Import of a header unit is allowed, named modules are not. |
| import "h2.h"; // expected-warning {{the implementation of header units is in an experimental phase}} |
| // A regular, untranslated, header |
| #include "h5.h" |
| |
| export module Xlate; |
| |
| // This is OK, the import immediately follows the module decl. |
| import "h3.h"; // expected-warning {{the implementation of header units is in an experimental phase}} |
| |
| // This should *not* be include-translated, even if header unit for h4 is |
| // available. |
| #include "h4.h" |
| |
| export void charlie() { |
| foo(); |
| bar(); |
| baz(); |
| boo(); |
| five(); |
| } |
| |
| // CHECK: #pragma clang module import ".{{/|\\\\?}}h1.h" |
| // CHECK: import .{{/|\\\\?}}h2.h |
| // CHECK: import .{{/|\\\\?}}h3.h |
| // CHECK-NOT: #pragma clang module import ".{{/|\\\\?}}h4.h" |