llvm/clang/test/Modules/cxx20-import-diagnostics-a.cpp

// 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