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. */