https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93631
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords|ice-on-valid-code |ice-on-invalid-code Status|ASSIGNED |NEW CC| |jsm28 at gcc dot gnu.org, | |mpolacek at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Component|middle-end |c Assignee|rguenth at gcc dot gnu.org |unassigned at gcc dot gnu.org --- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- smaller "invalid" testcase (why don't we diagnose it?): int f2 ( int x [ strcmp ( ) ] , int b ) { return x[0] - b ; } it's interesting that if I declare strcmp to avoid an implicit declaration warning with the following it stops to ICE... int strcmp(); so somehow the FEs decl merging for an implicit declaration coming from the argument list is "broken" and doesn't avoid pre-empting the built-in declaration? While I have a patch to paper over the issue in the middle-end it would be nice to avoid the issue in the frontend. The middle-end patch would do the following, using the canonical built-in declaration for argument verification. Similar issues exist for target builtins since we also have a target specific folder. Not sure how the FE deals with user-provided "bogus" implementations of those (and whether they ever exist in non __builtin_ obfuscated variants). diff --git a/gcc/gimple.c b/gcc/gimple.c index 324e706d508..d64c2a77ea3 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -2698,6 +2698,11 @@ gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl) { gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN); + /* Use the decl we are actually expecting for comparison, not a possibly + bogus one from the user the C frontend is happily marking as builtin. */ + if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL) + fndecl = builtin_decl_explicit (DECL_FUNCTION_CODE (fndecl)); + tree ret = gimple_call_lhs (stmt); if (ret && !useless_type_conversion_p (TREE_TYPE (ret), CCing C FE folks.