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; +}