On 7/20/23 05:35, Nathaniel Shead wrote:
This adds rudimentary lifetime tracking in C++ constexpr contexts,
allowing the compiler to report errors with using values after their
backing has gone out of scope. We don't yet handle other ways of
accessing values outside their lifetime (e.g. following explicit
destructor calls).

Incidentally, much of that should be straightforward to handle by no longer ignoring clobbers here:

    case MODIFY_EXPR:
      if (cxx_dialect < cxx14)
        goto fail;
      if (!RECUR (TREE_OPERAND (t, 0), any))
        return false;
      /* Just ignore clobbers.  */
      if (TREE_CLOBBER_P (TREE_OPERAND (t, 1)))
        return true;

Assignment from a clobber represents end of lifetime to the middle-end. This can be a follow-up patch.

@@ -7051,10 +7065,17 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, 
tree t,
        return ctx->ctor;
        if (VAR_P (t))
        if (tree v = ctx->global->get_value (t))
-           {
-             r = v;
-             break;
-           }
+         {
+           r = v;
+           break;
+         }
+      if (ctx->global->is_outside_lifetime (t))
+       {
+         if (!ctx->quiet)
+           outside_lifetime_error (loc, t);
+         *non_constant_p = true;
+         break;
+       }

Shouldn't this new check also be under the if (VAR_P (t))? A CONST_DECL can't go out of scope.

Jason

Reply via email to