|  | // RUN: rm -rf %t | 
|  | // RUN: mkdir -p %t | 
|  | // RUN: split-file %s %t | 
|  | // | 
|  | // RUN: %clang_cc1 -std=c++20 %t/Invisible.cppm -emit-module-interface -o %t/Invisible.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/Other.cppm -emit-module-interface -fprebuilt-module-path=%t \ | 
|  | // RUN:     -o %t/Other.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/Another.cppm -emit-module-interface -o %t/Another.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A-interface.cppm -emit-module-interface \ | 
|  | // RUN:     -fprebuilt-module-path=%t -o %t/A-interface.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A-interface2.cppm -emit-module-interface \ | 
|  | // RUN:     -fprebuilt-module-path=%t -o %t/A-interface2.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A-interface3.cppm -emit-module-interface \ | 
|  | // RUN:     -fprebuilt-module-path=%t -o %t/A-interface3.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface \ | 
|  | // RUN:     -fprebuilt-module-path=%t -o %t/A.pcm | 
|  |  | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A.cpp -fprebuilt-module-path=%t -fsyntax-only -verify | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A-impl.cppm -fprebuilt-module-path=%t -fsyntax-only -verify | 
|  |  | 
|  | // RUN: %clang_cc1 -std=c++20 %t/A-impl2.cppm -fprebuilt-module-path=%t -fsyntax-only -verify | 
|  |  | 
|  | //--- Invisible.cppm | 
|  | export module Invisible; | 
|  | export void invisible() {} | 
|  |  | 
|  | //--- Other.cppm | 
|  | export module Other; | 
|  | import Invisible; | 
|  | export void other() {} | 
|  |  | 
|  | //--- Another.cppm | 
|  | export module Another; | 
|  | export void another() {} | 
|  |  | 
|  | //--- A-interface.cppm | 
|  | export module A:interface; | 
|  | import Other; | 
|  | export void a_interface() {} | 
|  |  | 
|  | //--- A-interface2.cppm | 
|  | export module A:interface2; | 
|  | import Another; | 
|  | export void a_interface2() {} | 
|  |  | 
|  | //--- A-interface3.cppm | 
|  | export module A:interface3; | 
|  | import :interface; | 
|  | import :interface2; | 
|  | export void a_interface3() {} | 
|  |  | 
|  | //--- A.cppm | 
|  | export module A; | 
|  | import Another; | 
|  | import :interface; | 
|  | import :interface2; | 
|  | import :interface3; | 
|  |  | 
|  | export void a() {} | 
|  | export void impl(); | 
|  |  | 
|  | //--- A.cpp | 
|  | module A; | 
|  | void impl() { | 
|  | a_interface(); | 
|  | a_interface2(); | 
|  | a_interface3(); | 
|  |  | 
|  | other(); | 
|  | another(); | 
|  |  | 
|  | invisible(); // expected-error {{declaration of 'invisible' must be imported from module 'Invisible' before it is required}} | 
|  | // expected-note@* {{declaration here is not visible}} | 
|  | } | 
|  |  | 
|  | //--- A-impl.cppm | 
|  | module A:impl; | 
|  | import :interface3; | 
|  |  | 
|  | void impl_part() { | 
|  | a_interface(); | 
|  | a_interface2(); | 
|  | a_interface3(); | 
|  |  | 
|  | other(); | 
|  | another(); | 
|  |  | 
|  | invisible(); // expected-error {{declaration of 'invisible' must be imported from module 'Invisible' before it is required}} | 
|  | // expected-note@* {{declaration here is not visible}} | 
|  | } | 
|  |  | 
|  | //--- A-impl2.cppm | 
|  | module A:impl2; | 
|  | import A; | 
|  |  | 
|  | void impl_part2() { | 
|  | a(); | 
|  | impl(); | 
|  |  | 
|  | a_interface(); | 
|  | a_interface2(); | 
|  | a_interface3(); | 
|  |  | 
|  | other(); | 
|  | another(); | 
|  |  | 
|  | invisible(); // expected-error {{declaration of 'invisible' must be imported from module 'Invisible' before it is required}} | 
|  | // expected-note@* {{declaration here is not visible}} | 
|  | } |