On 7/10/25 4:05 AM, Jakub Jelinek wrote:
On Wed, Jul 09, 2025 at 06:45:41PM -0400, Jason Merrill wrote:
+         && reduced_constant_expression_p (val))

And a value doesn't need to be constant to be printable, we should be able
to print it unconditionally.

Sure, the question is if printing non-constant value is better for users.
The change to do unconditionally the %qE results in
/usr/src/gcc/gcc/testsuite/g++.dg/cpp26/constexpr-eh12.C:71:49: error: uncaught 
exception '(E*)(& heap )'
while previously it was
/usr/src/gcc/gcc/testsuite/g++.dg/cpp26/constexpr-eh12.C:71:49: error: uncaught 
exception of type 'E*'
I've kept the conditional for now but if you really want that change, can 
remove it
in the 2 spots and tweak constexpr-eh12.C test's expectations.

Fair enough, we can leave it.

      case CLEANUP_STMT:
        r = cxx_eval_constant_expression (ctx, CLEANUP_BODY (t), lval,
                                        non_constant_p, overflow_p,
                                        jump_target);
-      if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
+      if ((!CLEANUP_EH_ONLY (t) || throws (jump_target)) && !*non_constant_p)
        {
          iloc_sentinel ils (loc);
+         tree jmp_target = NULL_TREE;
          /* Also evaluate the cleanup.  */
          cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), vc_discard,
-                                       non_constant_p, overflow_p);
+                                       non_constant_p, overflow_p,
+                                       &jmp_target);
+         if (throws (&jmp_target))
+           {
+             if (throws (jump_target))
+               {
+                 /* [except.throw]/9 - If the exception handling mechanism
+                    handling an uncaught exception directly invokes a function
+                    that exits via an exception, the function std::terminate is
+                    invoked.  */
+                 if (!ctx->quiet)
+                   {
+                     auto_diagnostic_group d;
+                     diagnose_std_terminate (loc, ctx, *jump_target);
+                     inform (loc, "destructor exited with an exception");
+                   }
+                 *non_constant_p = true;
+                 *jump_target = NULL_TREE;
+                 r = NULL_TREE;
+               }
+             else
+               *jump_target = jmp_target;

Can't you use merge_jump_target here, too?

OK with that change.

Jason

Reply via email to