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 >