aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-04-01 21:35:45 -0400
committerJason Merrill <jason@gcc.gnu.org>2016-04-01 21:35:45 -0400
commitddd6d4211a152d5f493fc634c210bbadb9ae0217 (patch)
tree3d8cb5b82d12dce5980434c7ac2c815c90591b2f
parentbb727032821479aaa585a779b7c1d6c74822e0de (diff)
downloadgcc-ddd6d4211a152d5f493fc634c210bbadb9ae0217.zip
gcc-ddd6d4211a152d5f493fc634c210bbadb9ae0217.tar.gz
gcc-ddd6d4211a152d5f493fc634c210bbadb9ae0217.tar.bz2
re PR c++/70449 (ICE with -Wall on valid code on x86_64-linux-gnu in pp_string, at pretty-print.c:928)
PR c++/70449 PR c++/70344 * pt.c (instantiate_decl): A function isn't fully defined if DECL_INITIAL is error_mark_node. * constexpr.c (cxx_eval_call_expression): Likewise. From-SVN: r234695
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/constexpr.c20
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/constexpr-recursion1.C16
4 files changed, 30 insertions, 17 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2452830..a755e37 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2016-04-01 Jason Merrill <jason@redhat.com>
+
+ PR c++/70449
+ PR c++/70344
+ * pt.c (instantiate_decl): A function isn't fully defined if
+ DECL_INITIAL is error_mark_node.
+ * constexpr.c (cxx_eval_call_expression): Likewise.
+
2016-04-01 Jakub Jelinek <jakub@redhat.com>
Marek Polacek <polacek@redhat.com>
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index ea605dc..979f01f 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -1239,21 +1239,6 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
return t;
}
- if (fun == current_function_decl)
- {
- /* A call to the current function, i.e.
- constexpr int f (int i) {
- constexpr int j = f(i-1);
- return j;
- }
- This would be OK without the constexpr on the declaration of j. */
- if (!ctx->quiet)
- error_at (loc, "%qD called in a constant expression before its "
- "definition is complete", fun);
- *non_constant_p = true;
- return t;
- }
-
constexpr_ctx new_ctx = *ctx;
if (DECL_CONSTRUCTOR_P (fun) && !ctx->object
&& TREE_CODE (t) == AGGR_INIT_EXPR)
@@ -1308,7 +1293,10 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
{
if (!ctx->quiet)
{
- if (DECL_INITIAL (fun))
+ if (DECL_INITIAL (fun) == error_mark_node)
+ error_at (loc, "%qD called in a constant expression before its "
+ "definition is complete", fun);
+ else if (DECL_INITIAL (fun))
{
/* The definition of fun was somehow unsuitable. */
error_at (loc, "%qD called in a constant expression", fun);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index a6398c0..2d93a5c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -21741,7 +21741,8 @@ instantiate_decl (tree d, int defer_ok,
if (TREE_CODE (d) == FUNCTION_DECL)
{
deleted_p = DECL_DELETED_FN (code_pattern);
- pattern_defined = (DECL_SAVED_TREE (code_pattern) != NULL_TREE
+ pattern_defined = ((DECL_SAVED_TREE (code_pattern) != NULL_TREE
+ && DECL_INITIAL (code_pattern) != error_mark_node)
|| DECL_DEFAULTED_OUTSIDE_CLASS_P (code_pattern)
|| deleted_p);
}
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-recursion1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-recursion1.C
new file mode 100644
index 0000000..79e0b5a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-recursion1.C
@@ -0,0 +1,16 @@
+// PR c++/70449
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wall" }
+
+template <int N>
+constexpr int f1 ()
+{
+ enum E { a = f1<0> () }; // { dg-error "called in a constant expression before its definition is complete|is not an integer constant" }
+ return 0;
+}
+
+constexpr int f3 ()
+{
+ enum E { a = f3 () }; // { dg-error "called in a constant expression before its definition is complete|is not an integer constant" }
+ return 0;
+}