On Fri, 9 Feb 2024, Patrick Palka wrote:

> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
> OK for trunk?
> 
> I'll try to reduce and add testcases overnight for these separate bugs
> before pushing.
> 
> -- >8 --
> 
> Building modular fmtlib triggered two small modules bugs in C++23 and
> C++26 mode respectively (due to libstdc++ header differences).
> 
> The first is that a TEMPLATE_DECL having DECL_LANG_SPECIFIC doesn't
> necessarily imply that its DECL_TEMPLATE_RESULT has DECL_LANG_SPECIFIC.
> So we need to use STRIP_TEMPLATE consistently; this is a follow-up to
> r12-7187-gdb84f382ae3dc2.
> 
> The second is that get_originating_module_decl was ICEing on class-scope
> enumerators injected via using-enum.
> 
> gcc/cp/ChangeLog:
> 
>       * module.cc (depset::hash::add_specializations): Use
>       STRIP_TEMPLATE consistently.
>       (get_originating_module_decl): Handle class-scope CONST_DECL.
> ---
>  gcc/cp/module.cc | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> index 3c2fef0e3f4..659fa03dae1 100644
> --- a/gcc/cp/module.cc
> +++ b/gcc/cp/module.cc
> @@ -13248,7 +13248,7 @@ depset::hash::add_specializations (bool decl_p)
>        if (use_tpl == 1)
>       /* Implicit instantiations only walked if we reach them.  */
>       needs_reaching = true;
> -      else if (!DECL_LANG_SPECIFIC (spec)
> +      else if (!DECL_LANG_SPECIFIC (STRIP_TEMPLATE (spec))
>              || !DECL_MODULE_PURVIEW_P (STRIP_TEMPLATE (spec)))
>       /* Likewise, GMF explicit or partial specializations.  */
>       needs_reaching = true;
> @@ -18708,7 +18708,8 @@ get_originating_module_decl (tree decl)
>        && (TREE_CODE (DECL_CONTEXT (decl)) == ENUMERAL_TYPE))
>      decl = TYPE_NAME (DECL_CONTEXT (decl));
>    else if (TREE_CODE (decl) == FIELD_DECL
> -        || TREE_CODE (decl) == USING_DECL)
> +        || TREE_CODE (decl) == USING_DECL
> +        || TREE_CODE (decl) == CONST_DECL)

On second thought maybe we should test for CONST_DECL_USING_P (decl)
specifically.  In other contexts a CONST_DECL could be a template
parameter, so using CONST_DECL_USING_P makes this code more readable
arguably.

>      {
>        decl = DECL_CONTEXT (decl);
>        if (TREE_CODE (decl) != FUNCTION_DECL)
> -- 
> 2.43.0.561.g235986be82
> 
> 

Reply via email to