[Bug ipa/65908] [5/6 Regression] ICE: in expand_thunk, at cgraphunit.c:1700

hubicka at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue May 12 19:44:00 GMT 2015


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65908

--- Comment #8 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
I think pushing TYPE_CANONICAL is a bug: we do check ODR properties of the
parameter and TYPE_CANONICAL is not guaranteed to be the same. Just remove the
TYPE_CANONICAL wrap here.

The patch seems OK with this change both for mainline and branch. We will match
the types of DECL_ARGUMENTS when verifying the body here:

  for (arg1 = DECL_ARGUMENTS (decl),
       arg2 = DECL_ARGUMENTS (m_compared_func->decl);
       arg1; arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
    if (!m_checker->compare_decl (arg1, arg2))
      return return_false ();

However I think there is one extra case to deal with. For functions that are
!prototype_p, we get empty ARG_TYPES and only have ARGUMENTS. Such functions
will bypass the checks:

      if (POINTER_TYPE_P (arg_types[i])
          && (TYPE_RESTRICT (arg_types[i]) 
              != TYPE_RESTRICT (m_compared_func->arg_types[i])))
        return return_false_with_msg ("argument restrict flag mismatch");
      /* nonnull_arg_p implies non-zero range to REFERENCE types.  */
      if (POINTER_TYPE_P (arg_types[i])
          && TREE_CODE (arg_types[i])
             != TREE_CODE (m_compared_func->arg_types[i])
          && opt_for_fn (decl, flag_delete_null_pointer_checks))
        return return_false_with_msg ("pointer wrt reference mismatch");

Please factor out this code to a function compatible_parm_types_p and call it
both from sem_function::equals_wpa and the loop above.

Honza



More information about the Gcc-bugs mailing list