llvm-capstone/clang/test/Modules/export-language-linkage.cppm
Chuanqi Xu 0e7b30fa82 [C++20] [Modules] Enhance better diagnostic for implicit global module and module partitions
Due to an oversight, when users use an unexported declaration from
implicit global module, the diagnostic will show "please #include"
instead of "please import". This patch corrects the behavior.

Also previously, when users use an unexported declarations from module
partitions, the diagnostic message will always show the partition name
no matter if that partition name is visible to the users. Now the users
may only see the partition name if the users are in the same module with
the partition unit.
2023-11-10 10:58:07 +08:00

64 lines
1.5 KiB
C++

// RUN: rm -rf %t
// RUN: split-file %s %t
// RUN: cd %t
//
// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm
// RUN: %clang_cc1 -module-file-info %t/a.pcm | FileCheck %t/a.cppm
// RUN: %clang_cc1 -std=c++20 %t/b.cpp -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
// RUN: %clang_cc1 -std=c++20 %t/c.cppm -emit-module-interface -o %t/c.pcm
// RUN: %clang_cc1 -std=c++20 %t/d.cpp -fsyntax-only -verify -fmodule-file=c=%t/c.pcm
//--- a.cppm
export module a;
export extern "C++" int foo() { return 43; }
export extern "C++" {
int a();
int b();
int c();
}
export {
extern "C++" void f1();
extern "C++" void f2();
extern "C++" void f3();
}
extern "C++" void unexported();
// CHECK: Sub Modules:
// CHECK-NEXT: Implicit Module Fragment '<implicit global>'
//--- b.cpp
import a;
int use() {
a();
b();
c();
f1();
f2();
f3();
unexported(); // expected-error {{declaration of 'unexported' must be imported from module 'a' before it is required}}
// expected-note@a.cppm:15 {{declaration here is not visible}}
return foo();
}
//--- c.cppm
export module c;
extern "C++" {
export int f();
int h();
}
extern "C++" export int g();
//--- d.cpp
import c;
int use() {
return f() + g();
}
int use_of_nonexported() {
return h(); // expected-error {{declaration of 'h' must be imported from module 'c' before it is required}}
// expected-note@c.cppm:4 {{declaration here is not visible}}
}