// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu1.cpp \
// RUN: -o %t/B.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu2.cpp \
// RUN: -o %t/C.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu3.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/AOK1.pcm
// RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu4.cpp \
// RUN: -fmodule-file=AOK1=%t/AOK1.pcm -fmodule-file=B=%t/B.pcm \
// RUN: -fmodule-file=C=%t/C.pcm -o %t/tu_3.s -verify
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu5.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/BC.pcm -verify
// RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu6.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/tu_5.s -verify
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu7.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -o %t/D.pcm -verify
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu8.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -o %t/D.pcm -verify
// RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu9.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -o %t/tu_8.s -verify
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/import-diags-tu10.cpp \
// RUN: -o %t/B.pcm -verify
// RUN: %clang_cc1 -std=c++20 -emit-obj %t/import-diags-tu11.cpp \
// RUN: -fmodule-file=C=%t/C.pcm -o %t/impl.o
// Test again with reduced BMI.
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu1.cpp \
// RUN: -o %t/B.pcm
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu2.cpp \
// RUN: -o %t/C.pcm
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu3.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/AOK1.pcm
// RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu4.cpp \
// RUN: -fmodule-file=AOK1=%t/AOK1.pcm -fmodule-file=B=%t/B.pcm \
// RUN: -fmodule-file=C=%t/C.pcm -o %t/tu_3.s -verify
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu5.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/BC.pcm -verify
// RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu6.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -fmodule-file=C=%t/C.pcm -o %t/tu_5.s -verify
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu7.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -o %t/D.pcm -verify
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu8.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -o %t/D.pcm -verify
// RUN: %clang_cc1 -std=c++20 -S %t/import-diags-tu9.cpp \
// RUN: -fmodule-file=B=%t/B.pcm -o %t/tu_8.s -verify
// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/import-diags-tu10.cpp \
// RUN: -o %t/B.pcm -verify
// RUN: %clang_cc1 -std=c++20 -emit-obj %t/import-diags-tu11.cpp \
// RUN: -fmodule-file=C=%t/C.pcm -o %t/impl.o
// Test diagnostics for incorrect module import sequences.
//--- import-diags-tu1.cpp
export module B;
int foo ();
// expected-no-diagnostics
//--- import-diags-tu2.cpp
export module C;
int bar ();
// expected-no-diagnostics
//--- import-diags-tu3.cpp
export module AOK1;
import B;
export import C;
export int theAnswer ();
// expected-no-diagnostics
//--- import-diags-tu4.cpp
module;
module AOK1;
export import C; // expected-error {{export declaration can only be used within a module purview}}
int theAnswer () { return 42; }
//--- import-diags-tu5.cpp
export module BC;
export import B;
int foo () { return 10; }
import C; // expected-error {{imports must immediately follow the module declaration}}
//--- import-diags-tu6.cpp
module B; // implicitly imports B.
int foo () { return 10; }
import C; // expected-error {{imports must immediately follow the module declaration}}
//--- import-diags-tu7.cpp
module;
// We can only have preprocessor directives here, which permits
// header units (include-translated or not) and named modules.
import B;
export module D;
int delta ();
// expected-no-diagnostics
//--- import-diags-tu8.cpp
export module D;
int delta ();
module :private;
import B; // expected-error {{imports must immediately follow the module declaration}}
//--- import-diags-tu9.cpp
module B;
import B; // expected-error {{import of module 'B' appears within its own implementation}}
//--- import-diags-tu10.cpp
export module B;
import B; // expected-error {{import of module 'B' appears within its own interface}}
//--- import-diags-tu11.cpp
int x;
import C;
int baz() { return 6174; }
// expected-no-diagnostics