]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Allow exporting const-qualified namespace-scope variables [PR99232]
authorNathaniel Shead <nathanieloshead@gmail.com>
Wed, 15 Nov 2023 09:50:53 +0000 (20:50 +1100)
committerNathaniel Shead <nathanieloshead@gmail.com>
Fri, 24 Nov 2023 13:55:15 +0000 (00:55 +1100)
By [basic.link] p3.2.1, a non-template non-volatile const-qualified
variable is not necessarily internal linkage in a module declaration,
and rather may have module linkage (or external linkage if it is
exported, see p4.8).

PR c++/99232

gcc/cp/ChangeLog:

* decl.cc (grokvardecl): Don't mark variables attached to
modules as internal.

gcc/testsuite/ChangeLog:

* g++.dg/modules/pr99232_a.C: New test.
* g++.dg/modules/pr99232_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
gcc/cp/decl.cc
gcc/testsuite/g++.dg/modules/pr99232_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99232_b.C [new file with mode: 0644]

index 16b04ebe0f897240d0491565362109346a42475e..ed1401591fa2f5ecff09382e607a92ef3db35191 100644 (file)
@@ -11006,7 +11006,8 @@ grokvardecl (tree type,
                            && (DECL_THIS_EXTERN (decl)
                                || ! constp
                                || volatilep
-                               || inlinep));
+                               || inlinep
+                               || module_attach_p ()));
       TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);
     }
   /* Not at top level, only `static' makes a static definition.  */
diff --git a/gcc/testsuite/g++.dg/modules/pr99232_a.C b/gcc/testsuite/g++.dg/modules/pr99232_a.C
new file mode 100644 (file)
index 0000000..097fb5e
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/99232
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi pr99232 }
+
+export module pr99232;
+
+export const double lambda{ 1.3 };
+export constexpr int a = 42;
+
+export const double* get_lambda_addr() {
+  return &lambda;
+}
diff --git a/gcc/testsuite/g++.dg/modules/pr99232_b.C b/gcc/testsuite/g++.dg/modules/pr99232_b.C
new file mode 100644 (file)
index 0000000..a36a76f
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/99232
+// { dg-module-do run }
+// { dg-additional-options "-fmodules-ts" }
+
+import pr99232;
+
+double foo() { return lambda * 2.0; }
+static_assert(a == 42);
+
+int main() {
+  if (&lambda != get_lambda_addr())
+    __builtin_abort();
+}