>On 1/15/25 7:36 PM, yxj-github-437 wrote:
>>> On Fri, Jan 03, 2025 at 05:18:55PM +0000, xxx wrote:
>>>> From: yxj-github-437 <[email protected]>
>>>>
>>>> This patch attempts to fix an error when build module std. The reason for
>>>> the
>>>> error is __builrin_va_list (aka struct __va_list) is an internal linkage.
>>>> so
>>>> attempt to handle this builtin type by identifying whether
>>>> DECL_SOURCE_LOCATION (entity)
>>>> is BUILTINS_LOCATION.
>>>>
>>>
>>> Hi, thanks for the patch! I suspect this may not be sufficient to
>>> completely avoid issues with the __gnuc_va_list type; in particular, if
>>> it's internal linkage that may prevent it from being referred to in
>>> other ways by inline functions in named modules (due to P1815).
>>>
>>> Maybe a better approach would be to instead mark this builtin type as
>>> TREE_PUBLIC (presumably in aarch64_build_builtin_va_list)?
>>
>> Thanks, I change my patch to mark TREE_PUBLIC.
>
> Looks good to me if the ARM maintainers don't object.
>
> This patch is small enough not to worry about copyright, but
> "yxj-github-437 <[email protected]>" seems like a placeholder name, what
> name would you like the commit to use?
Thank for your help, and it's my github user name, so just keep it.
>> -- >8 --
>>
>> 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.
>>
>> /x/gcc-15.0.0/usr/bin/aarch64-linux-android-g++ -fmodules -std=c++23 -fPIC
>> -O2
>> -fsearch-include-path bits/std.cc -c
>> /x/gcc-15.0.0/usr/lib/gcc/aarch64-linux-android/15.0.0/include/c++/bits/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
>> * 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): mark __builtin_va_list
>> as TREE_PUBLIC
>> * testsuite/g++.dg/modules/builtin-8.C: New test
>> ---
>> 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(+)
>> create mode 100644 gcc/testsuite/g++.dg/modules/builtin-8.C
>>
>> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
>> index ad31e9d255c..e022526e573 100644
>> --- a/gcc/config/aarch64/aarch64.cc
>> +++ b/gcc/config/aarch64/aarch64.cc
>> @@ -21566,6 +21566,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 1e0791dc8c2..86838ebde5f 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 00000000000..ff91104e4a9
>> --- /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;
>> +}