https://gcc.gnu.org/g:ee636671898c6bce63d9b2a698007b609aabbfe8

commit r16-919-gee636671898c6bce63d9b2a698007b609aabbfe8
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri May 23 09:41:25 2025 -0400

    fold: DECL_VALUE_EXPR isn't simple [PR120400]
    
    This PR noted that fold_truth_andor was wrongly changing && to & where the
    RHS is a VAR_DECL with DECL_VALUE_EXPR; we can't assume that such can be
    evaluated unconditionally.
    
    To be more precise we could recurse into DECL_VALUE_EXPR, but that doesn't
    seem worth bothering with since typical uses involve a COMPONENT_REF, which
    is not simple.
    
            PR c++/120400
    
    gcc/ChangeLog:
    
            * fold-const.cc (simple_operand_p): False for vars with
            DECL_VALUE_EXPR.

Diff:
---
 gcc/fold-const.cc | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 5f48ced50636..014f42187932 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -5085,6 +5085,11 @@ simple_operand_p (const_tree exp)
                 #pragma weak, etc).  */
              && ! TREE_PUBLIC (exp)
              && ! DECL_EXTERNAL (exp)
+             /* DECL_VALUE_EXPR will expand to something non-simple.  */
+             && ! ((VAR_P (exp)
+                    || TREE_CODE (exp) == PARM_DECL
+                    || TREE_CODE (exp) == RESULT_DECL)
+                   && DECL_HAS_VALUE_EXPR_P (exp))
              /* Weakrefs are not safe to be read, since they can be NULL.
                 They are !TREE_PUBLIC && !DECL_EXTERNAL but still
                 have DECL_WEAK flag set.  */

Reply via email to