On Wed, May 14, 2025 at 3:41 PM Alexander Monakov <amona...@ispras.ru> wrote:
>
> As a followup to PAREN_EXPR verification, let's ensure that CONJ_EXPR is
> only used with COMPLEX_TYPE.  While at it, move the whole block towards
> the end of the switch, because unlike the other entries it needs to
> break out of the switch, not immediately return from the function,
> as after the switch we check that types of LHS and RHS match.
>
> Refactor a bit to avoid repeated blocks with debug_generic_expr.

OK (not sure I like goto very much).

Thanks,
Richard.

> gcc/ChangeLog:
>
>         * tree-cfg.cc (verify_gimple_assign_unary): Accept only
>         COMPLEX_TYPE for CONJ_EXPR.
> ---
>  gcc/tree-cfg.cc | 37 +++++++++++++++++++++----------------
>  1 file changed, 21 insertions(+), 16 deletions(-)
>
> diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
> index 6a95b82ff4..b342b14771 100644
> --- a/gcc/tree-cfg.cc
> +++ b/gcc/tree-cfg.cc
> @@ -3867,22 +3867,6 @@ verify_gimple_assign_unary (gassign *stmt)
>
>        return false;
>
> -    case NEGATE_EXPR:
> -    case ABS_EXPR:
> -    case BIT_NOT_EXPR:
> -    case PAREN_EXPR:
> -    case CONJ_EXPR:
> -      /* Disallow pointer and offset types for many of the unary gimple. */
> -      if (POINTER_TYPE_P (lhs_type)
> -         || TREE_CODE (lhs_type) == OFFSET_TYPE)
> -       {
> -         error ("invalid types for %qs", code_name);
> -         debug_generic_expr (lhs_type);
> -         debug_generic_expr (rhs1_type);
> -         return true;
> -       }
> -      break;
> -
>      case ABSU_EXPR:
>        if (!ANY_INTEGRAL_TYPE_P (lhs_type)
>           || !TYPE_UNSIGNED (lhs_type)
> @@ -3908,6 +3892,27 @@ verify_gimple_assign_unary (gassign *stmt)
>         }
>        return false;
>
> +    case CONJ_EXPR:
> +      if (TREE_CODE (lhs_type) != COMPLEX_TYPE)
> +       {
> +diagnose_unary_lhs:
> +         error ("invalid type for %qs", code_name);
> +         debug_generic_expr (lhs_type);
> +         return true;
> +       }
> +      break;
> +
> +    case NEGATE_EXPR:
> +    case ABS_EXPR:
> +    case BIT_NOT_EXPR:
> +      if (POINTER_TYPE_P (lhs_type) || TREE_CODE (lhs_type) == OFFSET_TYPE)
> +       goto diagnose_unary_lhs;
> +      /* FALLTHRU */
> +    case PAREN_EXPR:
> +      if (AGGREGATE_TYPE_P (lhs_type))
> +       goto diagnose_unary_lhs;
> +      break;
> +
>      default:
>        gcc_unreachable ();
>      }
> --
> 2.49.0
>

Reply via email to