On Thu, Sep 07, 2023 at 10:36:02AM +0200, Thomas Schwinge wrote: > Minor comment/question: are we doing away with the property that > 'assert'-like "calls" must not have side effects? Per 'gcc/system.h', > this is "OK" for 'gcc_assert' for '#if ENABLE_ASSERT_CHECKING' or > '#elif (GCC_VERSION >= 4005)' -- that is, GCC 4.5, which is always-true, > thus the "offending" '#else' is never active. However, it's different > for standard 'assert' and 'gcc_checking_assert', so I'm not sure if > that's a good property for 'gcc_assert' only? For example, see also > <https://gcc.gnu.org/PR6906> "warn about asserts with side effects", or > recent <https://gcc.gnu.org/PR111144> > "RFE: could -fanalyzer warn about assertions that have side effects?".
You're right, the #define gcc_assert(EXPR) ((void)(0 && (EXPR))) fallback definition is incompatible with the way I've used it, so for --disable-checking built by non-GCC it would not work properly. Fixed thusly, committed to trunk as obvious. 2023-09-07 Jakub Jelinek <ja...@redhat.com> PR c/102989 * expr.cc (expand_expr_real_1): Don't call targetm.c.bitint_type_info inside gcc_assert, as later code relies on it filling info variable. * gimple-fold.cc (clear_padding_bitint_needs_padding_p, clear_padding_type): Likewise. * varasm.cc (output_constant): Likewise. * fold-const.cc (native_encode_int, native_interpret_int): Likewise. * stor-layout.cc (finish_bitfield_representative, layout_type): Likewise. * gimple-lower-bitint.cc (bitint_precision_kind): Likewise. --- gcc/expr.cc.jj 2023-09-06 17:28:24.216977643 +0200 +++ gcc/expr.cc 2023-09-07 11:11:57.761912944 +0200 @@ -11039,7 +11039,8 @@ expand_expr_real_1 (tree exp, rtx target { unsigned int prec = TYPE_PRECISION (type); struct bitint_info info; - gcc_assert (targetm.c.bitint_type_info (prec, &info)); + bool ok = targetm.c.bitint_type_info (prec, &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); unsigned int limb_prec = GET_MODE_PRECISION (limb_mode); --- gcc/gimple-fold.cc.jj 2023-09-06 17:28:24.221977578 +0200 +++ gcc/gimple-fold.cc 2023-09-07 11:11:57.765912888 +0200 @@ -4602,7 +4602,8 @@ static bool clear_padding_bitint_needs_padding_p (tree type) { struct bitint_info info; - gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), &info)); + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); + gcc_assert (ok); if (info.extended) return false; scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); @@ -4880,7 +4881,8 @@ clear_padding_type (clear_padding_struct case BITINT_TYPE: { struct bitint_info info; - gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), &info)); + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode)) { --- gcc/varasm.cc.jj 2023-09-06 17:28:24.239977342 +0200 +++ gcc/varasm.cc 2023-09-07 11:11:57.769912832 +0200 @@ -5289,8 +5289,8 @@ output_constant (tree exp, unsigned HOST { struct bitint_info info; tree type = TREE_TYPE (exp); - gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), - &info)); + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode)) { --- gcc/fold-const.cc.jj 2023-09-06 17:28:24.219977604 +0200 +++ gcc/fold-const.cc 2023-09-07 11:11:57.772912790 +0200 @@ -7731,8 +7731,8 @@ native_encode_int (const_tree expr, unsi if (TREE_CODE (type) == BITINT_TYPE) { struct bitint_info info; - gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), - &info)); + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); if (TYPE_PRECISION (type) > GET_MODE_PRECISION (limb_mode)) { @@ -8661,8 +8661,8 @@ native_interpret_int (tree type, const u if (TREE_CODE (type) == BITINT_TYPE) { struct bitint_info info; - gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), - &info)); + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); if (TYPE_PRECISION (type) > GET_MODE_PRECISION (limb_mode)) { --- gcc/stor-layout.cc.jj 2023-09-06 17:28:24.226977512 +0200 +++ gcc/stor-layout.cc 2023-09-07 11:11:57.775912748 +0200 @@ -2152,7 +2152,8 @@ finish_bitfield_representative (tree rep { struct bitint_info info; unsigned prec = TYPE_PRECISION (TREE_TYPE (field)); - gcc_assert (targetm.c.bitint_type_info (prec, &info)); + bool ok = targetm.c.bitint_type_info (prec, &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); unsigned lprec = GET_MODE_PRECISION (limb_mode); if (prec > lprec) @@ -2413,7 +2414,8 @@ layout_type (tree type) { struct bitint_info info; int cnt; - gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), &info)); + bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode)) { --- gcc/gimple-lower-bitint.cc.jj 2023-09-06 17:49:21.945490318 +0200 +++ gcc/gimple-lower-bitint.cc 2023-09-07 11:11:57.778912706 +0200 @@ -92,7 +92,8 @@ bitint_precision_kind (int prec) return bitint_prec_middle; struct bitint_info info; - gcc_assert (targetm.c.bitint_type_info (prec, &info)); + bool ok = targetm.c.bitint_type_info (prec, &info); + gcc_assert (ok); scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode); if (prec <= GET_MODE_PRECISION (limb_mode)) { Jakub