On 10/10/19 7:49 PM, Jason Merrill wrote:
> On 10/10/19 10:42 AM, Bernd Edlinger wrote:
>> Hi,
>>
>> this fixes a crash when -Wshadow=compatible-local is
>> enabled in the testcase g++.dg/parse/crash68.C
> 
> Why does that flag cause this crash?
> 

gcc/cp/name-lookup.c:

      if (warn_shadow)
        warning_code = OPT_Wshadow;
      else if (warn_shadow_local)
        warning_code = OPT_Wshadow_local;
      else if (warn_shadow_compatible_local
               && (same_type_p (TREE_TYPE (old), TREE_TYPE (decl))
                   || (!dependent_type_p (TREE_TYPE (decl))
                       && !dependent_type_p (TREE_TYPE (old))
                       /* If the new decl uses auto, we don't yet know
                          its type (the old type cannot be using auto
                          at this point, without also being
                          dependent).  This is an indication we're
                          (now) doing the shadow checking too
                          early.  */
                       && !type_uses_auto (TREE_TYPE (decl))
                       && can_convert (TREE_TYPE (old), TREE_TYPE (decl),
                                       tf_none))))
        warning_code = OPT_Wshadow_compatible_local;

if -Wshadow=compatible-local is used, the can_convert function crashes
in instantiate_class_template_1.

The problem there is that CLASSTYPE_TI_TEMPLATE (type)
uses CLASSTYPE_TEMPLATE_INFO (type) but that is NULL.

Since other errors may return error_mark_node as well
and the template is totally erroneous anyway, I figured
we might get away with that simple fix. 


Bernd.

Reply via email to