https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104513
Bug ID: 104513 Summary: [12 Regression] goto cdtor_label failures on arm since r12-5256 Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- struct A { int a1; short a2; short a3; long a4; constexpr A() : a1(), a2(), a3(), a4() { return; } }; is rejected since r12-5256-g37326651b439bac55d96fb5a43f4daf25e401eda on arm with: mptPathString.ii: In constructor ‘constexpr A::A()’: mptPathString.ii:6:44: error: ‘goto’ is not a constant expression 6 | constexpr A() : a1(), a2(), a3(), a4() { return; } | ^~~~~~ for -std=c++14 and higher. Also, struct S { constexpr S (int x) : s (x) {} constexpr ~S () { s = 5; return; s = 6; } int s; }; constexpr S s = 42; is rejected with -std=c++20 and higher on all arches incorrectly, but this one for much longer (GCC 10+). finish_return_stmt does: if (DECL_DESTRUCTOR_P (current_function_decl) || (DECL_CONSTRUCTOR_P (current_function_decl) && targetm.cxx.cdtor_returns_this ())) { /* Similarly, all destructors must run destructors for base-classes before returning. So, all returns in a destructor get sent to the DTOR_LABEL; finish_function emits code to return a value there. */ return finish_goto_stmt (cdtor_label); } and so I think we need to mark the goto or label somehow to tell potential_constant_expression that this is an artificial goto which is ok.