https://gcc.gnu.org/g:5c012971969db94f88335d9bacd192d318564daa

commit r16-649-g5c012971969db94f88335d9bacd192d318564daa
Author: Alexander Monakov <amona...@ispras.ru>
Date:   Mon May 12 23:23:31 2025 +0300

    tighten type verification for CONJ_EXPR
    
    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.
    
    gcc/ChangeLog:
    
            * tree-cfg.cc (verify_gimple_assign_unary): Accept only
            COMPLEX_TYPE for CONJ_EXPR.

Diff:
---
 gcc/tree-cfg.cc | 47 +++++++++++++++++++++--------------------------
 1 file changed, 21 insertions(+), 26 deletions(-)

diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index 928459a38b2a..b342b147716a 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -3867,32 +3867,6 @@ verify_gimple_assign_unary (gassign *stmt)
 
       return false;
 
-    case NEGATE_EXPR:
-    case ABS_EXPR:
-    case BIT_NOT_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 PAREN_EXPR:
-      /* Disallow non arthmetic types on PAREN_EXPR. */
-      if (AGGREGATE_TYPE_P (lhs_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)
@@ -3918,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 ();
     }

Reply via email to