Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[C++20] [Modules] Support to export declarations in language linkage
Close #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
- Loading branch information
1 parent
87cf39a
commit bf52ead
Showing
13 changed files
with
167 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
// 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}} |