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

--- Comment #7 from Martin Sebor <msebor at gcc dot gnu.org> ---
The MIN_EXPR code predates my change -- r255898 just moved indentation.  Based
on past experience I would assume MIN_EXPR to need the same types.  The code in
expand_builtin_strncmp mixes ssizetype and sizetype:

    len1 = c_strlen (arg1, 1);   // returns ssizetype
    len2 = c_strlen (arg2, 1);

    if (len1)
      len1 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len1);
    if (len2)
      len2 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len2);

    len3 = fold_convert_loc (loc, sizetype, arg3);
    ...
    if (len != len3)
      len = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (len), len, len3);

So the fix is presumably to change len3 to

    len3 = fold_convert_loc (loc, ssizetype, arg3);

Given the difference between sizetype and ssizetype is just one 's' it seems
like an easy mistake to make.  If MIN_EXPR does, in fact, require arguments of
the same type then adding an assertion to fold_binary_loc() to verify it would
help expose these mistakes early.  I'm not sure what the right predicate is to
use in the assertion.  Just compare TYPE_MAIN_VARIANT of the two argument types
for equality?

Reply via email to