https://gcc.gnu.org/g:3469d0f6eaa6251882364ba304a3f67327f46a84

commit r15-7180-g3469d0f6eaa6251882364ba304a3f67327f46a84
Author: yxj-github-437 <2457369...@qq.com>
Date:   Thu Jan 16 08:36:15 2025 +0800

    c++/modules: Fix linkage checks for exported using-decls
    
    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 <ja...@redhat.com>

Diff:
---
 gcc/config/aarch64/aarch64.cc            | 1 +
 gcc/config/arm/arm.cc                    | 1 +
 gcc/testsuite/g++.dg/modules/builtin-8.C | 9 +++++++++
 3 files changed, 11 insertions(+)

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index a1f5619a6152..9c4e9bc8acde 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -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;
 
diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index 1e0791dc8c25..86838ebde5f8 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -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
index 000000000000..ff91104e4a96
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/builtin-8.C
@@ -0,0 +1,9 @@
+// { dg-additional-options -fmodules-ts }
+module;
+#include <stdarg.h>
+export module builtins;
+// { dg-module-cmi builtins }
+
+export {
+  using ::va_list;
+}

Reply via email to