]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++/modules: Fix linkage checks for exported using-decls
authoryxj-github-437 <2457369732@qq.com>
Thu, 16 Jan 2025 00:36:15 +0000 (08:36 +0800)
committerJason Merrill <jason@redhat.com>
Fri, 24 Jan 2025 16:54:34 +0000 (11:54 -0500)
This patch attempts to fix an error when build module std. The reason for
the error is __builtin_va_list (aka struct __va_list) has internal linkage.
so mark this builtin type as TREE_PUBLIC to make struct __va_list has
external linkage.

g++ -fmodules -std=c++23 -fsearch-include-path bits/std.cc -c
std.cc:3642:14:error: exporting ‘typedef __gnuc_va_list va_list’ that does not have external linkage
 3642 |   using std::va_list;
      |              ^~~~~~~
<built-in>: note: ‘struct __va_list’ declared here with internal linkage

gcc/ChangeLog:

* config/aarch64/aarch64.cc (aarch64_build_builtin_va_list): Mark
__builtin_va_list as TREE_PUBLIC.
* config/arm/arm.cc (arm_build_builtin_va_list): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/modules/builtin-8.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/config/aarch64/aarch64.cc
gcc/config/arm/arm.cc
gcc/testsuite/g++.dg/modules/builtin-8.C [new file with mode: 0644]

index a1f5619a615295c45f0f572b20f8e366e8e509b6..9c4e9bc8acde6cd9d266f56a2d7db51fe791c26d 100644 (file)
@@ -21584,6 +21584,7 @@ aarch64_build_builtin_va_list (void)
                             get_identifier ("__va_list"),
                             va_list_type);
   DECL_ARTIFICIAL (va_list_name) = 1;
+  TREE_PUBLIC (va_list_name) = 1;
   TYPE_NAME (va_list_type) = va_list_name;
   TYPE_STUB_DECL (va_list_type) = va_list_name;
 
index 1e0791dc8c25f3649bb3401f3905a8dce81e782d..86838ebde5f8dd9d2720a28d2d9e29c92b0a1910 100644 (file)
@@ -2906,6 +2906,7 @@ arm_build_builtin_va_list (void)
                             get_identifier ("__va_list"),
                             va_list_type);
   DECL_ARTIFICIAL (va_list_name) = 1;
+  TREE_PUBLIC (va_list_name) = 1;
   TYPE_NAME (va_list_type) = va_list_name;
   TYPE_STUB_DECL (va_list_type) = va_list_name;
   /* Create the __ap field.  */
diff --git a/gcc/testsuite/g++.dg/modules/builtin-8.C b/gcc/testsuite/g++.dg/modules/builtin-8.C
new file mode 100644 (file)
index 0000000..ff91104
--- /dev/null
@@ -0,0 +1,9 @@
+// { dg-additional-options -fmodules-ts }
+module;
+#include <stdarg.h>
+export module builtins;
+// { dg-module-cmi builtins }
+
+export {
+  using ::va_list;
+}