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

Reply via email to