From 4ddcdbf91224dc630c820a47a7bc7433f4fa6925 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 23 May 2016 23:34:55 -0400 Subject: [PATCH] PR c++/70344 - ICE with recursive constexpr * constexpr.c (cxx_eval_call_expression): Check for fun == current_function_decl again. From-SVN: r236625 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/constexpr.c | 10 ++++++++-- gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a93439cc7dc..9095576dd4a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-05-23 Jason Merrill + PR c++/70344 + * constexpr.c (cxx_eval_call_expression): Check for + fun == current_function_decl again. + PR c++/70584 * cp-gimplify.c (cp_fold) [INDIRECT_REF]: Call maybe_undo_parenthesized_ref. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 7b562605b7b..bb723f45b09 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1371,11 +1371,17 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t, else { new_call.fundef = retrieve_constexpr_fundef (fun); - if (new_call.fundef == NULL || new_call.fundef->body == NULL) + if (new_call.fundef == NULL || new_call.fundef->body == NULL + || fun == current_function_decl) { if (!ctx->quiet) { - if (DECL_INITIAL (fun) == error_mark_node) + /* We need to check for current_function_decl here in case we're + being called during cp_fold_function, because at that point + DECL_INITIAL is set properly and we have a fundef but we + haven't lowered invisirefs yet (c++/70344). */ + if (DECL_INITIAL (fun) == error_mark_node + || fun == current_function_decl) error_at (loc, "%qD called in a constant expression before its " "definition is complete", fun); else if (DECL_INITIAL (fun)) diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C index 978b998afeb..ce2280c856f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion2.C @@ -1,5 +1,6 @@ // PR c++/70344 // { dg-do compile { target c++11 } } +// { dg-options -O } struct Z { -- 2.30.2