On Thu, Oct 17, 2019 at 6:22 PM Jakub Jelinek <ja...@redhat.com> wrote: > > On Wed, Oct 16, 2019 at 04:36:07PM -0400, Jason Merrill wrote: > > > As for CLEANUP_STMT, I've tried it (the second patch), but it didn't > > > change > > > anything, the diagnostics was still > > > constexpr-dtor3.C:16:23: in ‘constexpr’ expansion of ‘f4()’ > > > constexpr-dtor3.C:16:24: in ‘constexpr’ expansion of ‘(& > > > w13)->W7::~W7()’ > > > constexpr-dtor3.C:5:34: error: inline assembly is not a constant > > > expression > > > 5 | constexpr ~W7 () { if (w == 5) asm (""); w = 3; } // { > > > dg-error "inline assembly is not a constant expression" } > > > | ^~~ > > > constexpr-dtor3.C:5:34: note: only unevaluated inline assembly is allowed > > > in a ‘constexpr’ function in C++2a > > > as without that change. > > > > That's because the patch changes EXPR_LOCATION for evaluation of the > > CLEANUP_BODY, but it should be for evaluation of CLEANUP_EXPR instead. > > Indeed, that works too. Bootstrapped/regtested on x86_64-linux and > i686-linux, ok for trunk?
OK, thanks. > 2019-10-18 Jakub Jelinek <ja...@redhat.com> > > * constexpr.c (cxx_eval_constant_expression) <case CLEANUP_STMT>: > Temporarily change input_location to CLEANUP_STMT location. > > * g++.dg/cpp2a/constexpr-dtor3.C: Expect in 'constexpr' expansion of > message on the line with variable declaration. > * g++.dg/ext/constexpr-attr-cleanup1.C: Likewise. > > --- gcc/cp/constexpr.c.jj 2019-10-17 00:15:50.126726231 +0200 > +++ gcc/cp/constexpr.c 2019-10-17 11:21:34.400062565 +0200 > @@ -4984,14 +4984,20 @@ cxx_eval_constant_expression (const cons > non_constant_p, overflow_p, > jump_target); > if (!CLEANUP_EH_ONLY (t) && !*non_constant_p) > - /* Also evaluate the cleanup. If we weren't skipping at the > - start of the CLEANUP_BODY, change jump_target temporarily > - to &initial_jump_target, so that even a return or break or > - continue in the body doesn't skip the cleanup. */ > - cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true, > - non_constant_p, overflow_p, > - jump_target ? &initial_jump_target > - : NULL); > + { > + location_t loc = input_location; > + if (EXPR_HAS_LOCATION (t)) > + input_location = EXPR_LOCATION (t); > + /* Also evaluate the cleanup. If we weren't skipping at the > + start of the CLEANUP_BODY, change jump_target temporarily > + to &initial_jump_target, so that even a return or break or > + continue in the body doesn't skip the cleanup. */ > + cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true, > + non_constant_p, overflow_p, > + jump_target ? &initial_jump_target > + : NULL); > + input_location = loc; > + } > } > break; > > --- gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C.jj 2019-10-17 > 00:15:49.425736657 +0200 > +++ gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C 2019-10-17 > 11:20:13.977290046 +0200 > @@ -149,7 +149,7 @@ constexpr int x3 = f3 (); > constexpr int > f4 () > { > - W7 w13 = 5; > + W7 w13 = 5; // { dg-message "in 'constexpr' expansion of" > } > return 0; > } > > --- gcc/testsuite/g++.dg/ext/constexpr-attr-cleanup1.C.jj 2019-10-03 > 00:32:15.604526950 +0200 > +++ gcc/testsuite/g++.dg/ext/constexpr-attr-cleanup1.C 2019-10-18 > 00:18:50.248166117 +0200 > @@ -15,7 +15,7 @@ cleanup2 (int *x) > constexpr bool > foo () > { > - int a __attribute__((cleanup (cleanup))) = 1; > + int a __attribute__((cleanup (cleanup))) = 1; // { dg-message "in > 'constexpr' expansion of" } > return true; > } > > > > Jakub