mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-05 23:52:45 +00:00
bf52ead24c
Close https://github.com/llvm/llvm-project/issues/60405 See the discussion in the above link for the background. What the patch does: - Rename `Module::ModuleKind::GlobalModuleFragment` to `Module::ModuleKind::ExplicitGlobalModuleFragment`. - Add another module kind `ImplicitGlobalModuleFragment` to `ModuleKind`. - Create an implicit global module fragment for the language linkage declarations inside a module purview. - If the language linkage lives inside the scope of an export decl, the created modules is marked as exported to outer modules. - In fact, Sema will only create at most 2 implicit global module fragments to avoid creating a lot of unnecessary modules in the edging case. Reviewed By: iains Differential Revision: https://reviews.llvm.org/D144367
53 lines
1.4 KiB
C++
53 lines
1.4 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 -std=c++20 %t/b.cpp -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
|
|
// RUN: %clang_cc1 -std=c++20 %t/c.cppm -fsyntax-only -verify
|
|
// RUN: %clang_cc1 -module-file-info %t/a.pcm | FileCheck %t/a.cppm
|
|
|
|
//--- 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 '<exported implicit global>'
|
|
// CHECK-NEXT: Implicit Module Fragment '<implicit global>'
|
|
|
|
//--- b.cpp
|
|
import a;
|
|
int use() {
|
|
a();
|
|
b();
|
|
c();
|
|
f1();
|
|
f2();
|
|
f3();
|
|
unexported(); // expected-error {{missing '#include'; 'unexported' must be declared before it is used}}
|
|
// expected-note@a.cppm:15 {{declaration here is not visible}}
|
|
return foo();
|
|
}
|
|
|
|
//--- c.cppm
|
|
export module c;
|
|
extern "C++" {
|
|
// We can't use `export` in an unnamed module.
|
|
export int f(); // expected-error {{export declaration can only be used within a module purview}}
|
|
}
|
|
|
|
extern "C++" export int g(); // expected-error {{export declaration can only be used within a module purview}}
|