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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|middle-end                  |c
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2026-01-07

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
rdiv_expr is wrong.

For the C front-end, this where we go wrong:
```
    case TRUNC_DIV_EXPR:
    case CEIL_DIV_EXPR:
    case FLOOR_DIV_EXPR:
    case ROUND_DIV_EXPR:
    case EXACT_DIV_EXPR:
      doing_div_or_mod = true;
      warn_for_div_by_zero (location, op1);

      if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
           || code0 == FIXED_POINT_TYPE || code0 == BITINT_TYPE
           || code0 == COMPLEX_TYPE
           || gnu_vector_type_p (type0))
          && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
              || code1 == FIXED_POINT_TYPE || code1 == BITINT_TYPE
              || code1 == COMPLEX_TYPE
              || gnu_vector_type_p (type1)))
        {
          enum tree_code tcode0 = code0, tcode1 = code1;

          if (code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
            tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
          if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
            tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));

          if (!(((tcode0 == INTEGER_TYPE || tcode0 == BITINT_TYPE)
                 && (tcode1 == INTEGER_TYPE || tcode1 == BITINT_TYPE))
                || (tcode0 == FIXED_POINT_TYPE && tcode1 == FIXED_POINT_TYPE)))
            resultcode = RDIV_EXPR;

```
c-typeck.cc:14465


For C++ it is similar:
```
      if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
           || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
          && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
              || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
        {
          enum tree_code tcode0 = code0, tcode1 = code1;
          doing_div_or_mod = true;
          warn_for_div_by_zero (location, fold_for_warn (op1));

          if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
            tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
          if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
            tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));

          if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
            resultcode = RDIV_EXPR;

```
cp/typeck.cc:5794


So front-end issues.

Reply via email to