60 lines · cpp
1// Tests that the definition in private module fragment is not reachable to its users.2//3// RUN: rm -rf %t4// RUN: mkdir -p %t5// RUN: split-file %s %t6//7// RUN: %clang_cc1 -std=c++20 %t/Private.cppm -emit-module-interface \8// RUN: -o %t/Private.pcm9// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp \10// RUN: -DTEST_BADINLINE -verify -fsyntax-only11 12// Test again with reduced BMI.13// RUN: rm -rf %t14// RUN: mkdir -p %t15// RUN: split-file %s %t16//17// RUN: %clang_cc1 -std=c++20 %t/Private.cppm -emit-reduced-module-interface \18// RUN: -o %t/Private.pcm19// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp \20// RUN: -DTEST_BADINLINE -verify -fsyntax-only21 22//--- Private.cppm23export module Private;24#ifdef TEST_BADINLINE25inline void fn_m(); // expected-error {{un-exported inline function not defined before the private module fragment}}26 // expected-note@Private.cppm:13 {{private module fragment begins here}}27#endif28static void fn_s();29export struct X;30 31export void g(X *x) {32 fn_s(); // OK, call to static function in same translation unit33#ifdef TEST_BADINLINE34 fn_m(); // fn_m is not OK.35#endif36}37export X *factory(); // OK38 39module :private;40struct X {}; // definition not reachable from importers of A41X *factory() {42 return new X();43}44void fn_m() {}45void fn_s() {}46 47//--- Use.cpp48import Private;49void foo() {50 X x; // expected-error 1+{{missing '#include'; 'X' must be defined before it is used}}51 // expected-note@Private.cppm:18 1+{{definition here is not reachable}}52 auto _ = factory();53 auto *__ = factory();54 X *___ = factory();55 56 g(__);57 g(___);58 g(factory());59}60