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