Re: [PATCH] c++, v2: Fix ICE during mangling of a conversion operator function template [PR126093]
Jason Merrill <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On 8/18/26 3:34 AM, Jakub Jelinek wrote:
> On Tue, Aug 11, 2026 at 04:25:19PM -0400, Jason Merrill wrote:
>> On 8/7/26 8:45 AM, Jakub Jelinek wrote:
>>> We ICE when trying to mangle the TEMPLATE_DECL of a conversion operator,
>>> because FNDECL_USED_AUTO macro requires FUNCTION_DECL, but here we
>>> have a TEMPLATE_DECL instead.
>>> In this case, DECL_CONV_FN_TYPE contains the right type, so this patch
>>> just guards the FNDECL_USED_AUTO macro use on FUNCTION_DECLs.
>>
>> Hmm, if it's valid to get a TEMPLATE_DECL here I think we want to
>> STRIP_TEMPLATE earlier in the function to avoid the need for this; lots of
>> other things here seem to assume we're looking at the inner decl.
>
> Ok, here is a different patch then to use STRIP_TEMPLATE before calling
> write_unqualified_name in the {class,function,variable,alias} template,
> concept, namespace alias and namespace (for the last two STRIP_TEMPLATE
> will do nothing, so I haven't moved it to a separate handling).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
> 2026-08-18 Jakub Jelinek <[email protected]>
>
> PR c++/126093
> * mangle.cc (write_reflection): Call write_unqualified_name on
> STRIP_TEMPLATE (arg) rather than just arg.
>
> * g++.dg/reflect/mangle1.C: Add 2 new tests for reflections of
> conversion templates.
>
> --- gcc/cp/mangle.cc.jj 2026-08-07 17:33:22.558549077 +0200
> +++ gcc/cp/mangle.cc 2026-08-17 19:57:43.384028251 +0200
> @@ -4302,7 +4302,7 @@ write_reflection (tree refl)
> || strcmp (prefix, "ns") == 0)
> {
> write_prefix (decl_mangling_context (arg));
> - write_unqualified_name (arg);
> + write_unqualified_name (STRIP_TEMPLATE (arg));
> }
> else if (strcmp (prefix, "ba") == 0)
> {
> --- gcc/testsuite/g++.dg/reflect/mangle1.C.jj 2026-08-07 17:33:22.564549003 +0200
> +++ gcc/testsuite/g++.dg/reflect/mangle1.C 2026-08-17 19:56:23.372630344 +0200
> @@ -15,6 +15,10 @@ struct S : B {
> int : 0;
> static int var;
> };
> +struct Q {
> + template <typename T>
> + operator T () { return T (); }
> +};
> struct W { union {}; union {}; union {}; union {}; };
> template <auto> struct TCls {};
> template <auto> void TFn ();
> @@ -65,6 +69,10 @@ namespace NS2 {
> struct Z {
> };
> struct AA { int a, b; };
> + struct Q {
> + template <int N>
> + operator int () { return N; }
> + };
> }
>
> constexpr auto ctx = std::meta::access_context::current ();
> @@ -147,6 +155,8 @@ baz (int x)
> bar <241, ^^NS2::TCls> (); // class template
> bar <250, ^^TFn> (); // function template
> bar <251, ^^NS2::TFn> (); // function template
> + bar <252, members_of (^^Q, ctx)[0]> (); // function template
> + bar <253, members_of (^^NS2::Q, ctx)[0]> (); // function template
> bar <260, ^^TVar> (); // variable template
> bar <261, ^^NS2::TVar> (); // variable template
> bar <270, ^^TAlias> (); // alias template
> @@ -239,6 +249,8 @@ baz (int x)
> // { dg-final { scan-assembler "_Z3barILi241ELDmct3NS24TClsEEvv" } }
> // { dg-final { scan-assembler "_Z3barILi250ELDmft3TFnEEvv" } }
> // { dg-final { scan-assembler "_Z3barILi251ELDmft3NS23TFnEEvv" } }
> +// { dg-final { scan-assembler "_Z3barILi252ELDmft1QcvT_EEvv" } }
> +// { dg-final { scan-assembler "_Z3barILi253ELDmft3NS21QcviEEvv" } }
> // { dg-final { scan-assembler "_Z3barILi260ELDmvt4TVarEEvv" } }
> // { dg-final { scan-assembler "_Z3barILi261ELDmvt3NS24TVarEEvv" } }
> // { dg-final { scan-assembler "_Z3barILi270ELDmat6TAliasEEvv" } }
>
>
> Jakub
>