[Bug c++/81942] ICE on empty constexpr constructor with C++14
paolo.carlini at oracle dot com
gcc-bugzilla@gcc.gnu.org
Fri Sep 1 21:02:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81942
Paolo Carlini <paolo.carlini at oracle dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #10 from Paolo Carlini <paolo.carlini at oracle dot com> ---
Well, if we are Ok with loosening a bit the gcc_assert which is firing for such
targets, I don't think we risk miscompiling anything, I think we are already
handling correctly the case of a return in user code which boils down to a goto
to a label immediately followed by return this.
I'm adding Jakub in CC, he hacked quite a bit related constexpr.c code in order
to completely fix constexpr-77467.C
Index: constexpr.c
===================================================================
--- constexpr.c (revision 251607)
+++ constexpr.c (working copy)
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "config.h"
#include "system.h"
#include "coretypes.h"
+#include "target.h"
#include "cp-tree.h"
#include "varasm.h"
#include "c-family/c-objc.h"
@@ -4554,7 +4555,14 @@ cxx_eval_constant_expression (const constexpr_ctx
case GOTO_EXPR:
*jump_target = TREE_OPERAND (t, 0);
- gcc_assert (breaks (jump_target) || continues (jump_target));
+ gcc_assert (breaks (jump_target) || continues (jump_target)
+ /* Allow for jumping to a cdtor_label. */
+ || (targetm.cxx.cdtor_returns_this ()
+ && *jump_target
+ && TREE_CODE (*jump_target) == LABEL_DECL
+ && DECL_ARTIFICIAL (*jump_target)
+ && (DECL_CONSTRUCTOR_P (DECL_CONTEXT (*jump_target))
+ || DECL_DESTRUCTOR_P (DECL_CONTEXT
(*jump_target)))));
break;
case LOOP_EXPR:
More information about the Gcc-bugs
mailing list