diff mbox series

c++: Support module language-decl semantics

Message ID 5bb16ba7-9ff1-161c-b17d-a71b09f902d6@acm.org
State New
Headers show
Series c++: Support module language-decl semantics | expand

Commit Message

Nathan Sidwell May 12, 2022, 11:18 a.m. UTC
In modules purview, one can attach a declaration to the global module
(i.e. not the named module in whence the declaration appears), using a
language declaration:

   export module Foo;
   extern "C++" void *operator new (std::size_t);

This implements those semantics.

Jonathan, I guess this might help with modularizing std?

nathan

Comments

Jonathan Wakely May 12, 2022, 2:24 p.m. UTC | #1
On Thu, 12 May 2022 at 12:18, Nathan Sidwell wrote:
>
> In modules purview, one can attach a declaration to the global module
> (i.e. not the named module in whence the declaration appears), using a
> language declaration:
>
>    export module Foo;
>    extern "C++" void *operator new (std::size_t);
>
> This implements those semantics.
>
> Jonathan, I guess this might help with modularizing std?

Nice, thanks. I'm going to give the 'std' module another try soon.
diff mbox series

Patch

From 78c8b0b980341f28de96da518a38bf85bbd24d98 Mon Sep 17 00:00:00 2001
From: Nathan Sidwell <nathan@acm.org>
Date: Mon, 9 May 2022 04:51:32 -0700
Subject: [PATCH] c++: Support module language-decl semantics

In modules purview, one can attach a declaration to the global module
(i.e. not the named module in whence the declaration appears), using a
language declaration:

  export module Foo;
  extern "C++" void *operator new (std::size_t);

This implements those semantics.

	gcc/cp/
	* parser.cc (cp_parser_linkage_specification): Implement
	global module attachment semantics.
	gcc/testsuite/
	* g++.dg/modules/lang-3_a.C: New.
	* g++.dg/modules/lang-3_b.C: New.
	* g++.dg/modules/lang-3_c.C: New.
---
 gcc/cp/parser.cc                        |  3 +++
 gcc/testsuite/g++.dg/modules/lang-3_a.C | 17 +++++++++++++++++
 gcc/testsuite/g++.dg/modules/lang-3_b.C | 18 ++++++++++++++++++
 gcc/testsuite/g++.dg/modules/lang-3_c.C | 12 ++++++++++++
 4 files changed, 50 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/modules/lang-3_a.C
 create mode 100644 gcc/testsuite/g++.dg/modules/lang-3_b.C
 create mode 100644 gcc/testsuite/g++.dg/modules/lang-3_c.C

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 84f379c7bff..8969ed0076a 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -16189,6 +16189,8 @@  cp_parser_linkage_specification (cp_parser* parser, tree prefix_attr)
     linkage = get_identifier (TREE_STRING_POINTER (linkage));
 
   /* We're now using the new linkage.  */
+  unsigned saved_module = module_kind;
+  module_kind &= ~MK_ATTACH;
   push_lang_context (linkage);
 
   /* Preserve the location of the innermost linkage specification,
@@ -16235,6 +16237,7 @@  cp_parser_linkage_specification (cp_parser* parser, tree prefix_attr)
 
   /* We're done with the linkage-specification.  */
   pop_lang_context ();
+  module_kind = saved_module;
 
   /* Restore location of parent linkage specification, if any.  */
   parser->innermost_linkage_specification_location = saved_location;
diff --git a/gcc/testsuite/g++.dg/modules/lang-3_a.C b/gcc/testsuite/g++.dg/modules/lang-3_a.C
new file mode 100644
index 00000000000..1c6fa1fa2e9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/lang-3_a.C
@@ -0,0 +1,17 @@ 
+// { dg-additional-options "-fmodules-ts -Wno-pedantic" }
+module;
+# 4 __FILE__ 1
+void Quux ();
+# 6 "" 2
+export module bob;
+// { dg-module-cmi bob }
+
+extern "C++" 
+{
+export void Bar () {}
+export void Quux ();
+void Baz () {}
+}
+
+// { dg-final { scan-assembler {_Z3Barv:} } }
+// { dg-final { scan-assembler {_Z3Bazv:} } }
diff --git a/gcc/testsuite/g++.dg/modules/lang-3_b.C b/gcc/testsuite/g++.dg/modules/lang-3_b.C
new file mode 100644
index 00000000000..17300ece699
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/lang-3_b.C
@@ -0,0 +1,18 @@ 
+// { dg-additional-options -fmodules-ts }
+import bob;
+
+void Foo () 
+{
+  Bar ();
+  Baz (); // { dg-error "was not declared" }
+  Quux ();
+}
+
+void Bar ();
+void Baz ();
+
+void Quux ()
+{
+  Bar ();
+  Baz ();
+}
diff --git a/gcc/testsuite/g++.dg/modules/lang-3_c.C b/gcc/testsuite/g++.dg/modules/lang-3_c.C
new file mode 100644
index 00000000000..ca18db72ad8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/lang-3_c.C
@@ -0,0 +1,12 @@ 
+// { dg-additional-options -fmodules-ts }
+module bob;
+
+void Foo () 
+{
+  Bar ();
+  Baz ();
+}
+
+extern "C++" void Bar ();
+extern "C++" void Baz ();
+
-- 
2.30.2