Commit 3c98ff9b by Nathan Sidwell Committed by Nathan Sidwell

constexpr.c (get_fundef_copy): Use the original function for non-recursive evaluations.

	cp/
	* constexpr.c (get_fundef_copy): Use the original function for
	non-recursive evaluations.
	(save_fundef_copy): Always expect a slot to be available.

	testsuite/
	* g++.dg/cpp0x/constexpr-recursion3.C: New.
	* g++.dg/ubsan/pr63956.C: Adjust error location.

From-SVN: r235506
parent 437244c7
2016-04-27 Nathan Sidwell <nathan@acm.org>
* constexpr.c (get_fundef_copy): Use the original function for
non-recursive evaluations.
(save_fundef_copy): Always expect a slot to be available.
2016-04-27 Bernd Schmidt <bschmidt@redhat.com> 2016-04-27 Bernd Schmidt <bschmidt@redhat.com>
* parser.c (cp_parser_postfix_expression): Call * parser.c (cp_parser_postfix_expression): Call
......
...@@ -989,7 +989,8 @@ maybe_initialize_fundef_copies_table () ...@@ -989,7 +989,8 @@ maybe_initialize_fundef_copies_table ()
} }
/* Reuse a copy or create a new unshared copy of the function FUN. /* Reuse a copy or create a new unshared copy of the function FUN.
Return this copy. */ Return this copy. We use a TREE_LIST whose PURPOSE is body, VALUE
is parms, TYPE is result. */
static tree static tree
get_fundef_copy (tree fun) get_fundef_copy (tree fun)
...@@ -997,15 +998,26 @@ get_fundef_copy (tree fun) ...@@ -997,15 +998,26 @@ get_fundef_copy (tree fun)
maybe_initialize_fundef_copies_table (); maybe_initialize_fundef_copies_table ();
tree copy; tree copy;
tree *slot = fundef_copies_table->get (fun); bool existed;
if (slot == NULL || *slot == NULL_TREE) tree *slot = &fundef_copies_table->get_or_insert (fun, &existed);
if (!existed)
{ {
/* There is no cached function available, or in use. We can use
the function directly. That the slot is now created records
that this function is now in use. */
copy = build_tree_list (DECL_SAVED_TREE (fun), DECL_ARGUMENTS (fun));
TREE_TYPE (copy) = DECL_RESULT (fun);
}
else if (*slot == NULL_TREE)
{
/* We've already used the function itself, so make a copy. */
copy = build_tree_list (NULL, NULL); copy = build_tree_list (NULL, NULL);
/* PURPOSE is body, VALUE is parms, TYPE is result. */
TREE_PURPOSE (copy) = copy_fn (fun, TREE_VALUE (copy), TREE_TYPE (copy)); TREE_PURPOSE (copy) = copy_fn (fun, TREE_VALUE (copy), TREE_TYPE (copy));
} }
else else
{ {
/* We have a cached function available. */
copy = *slot; copy = *slot;
*slot = TREE_CHAIN (copy); *slot = TREE_CHAIN (copy);
} }
...@@ -1013,12 +1025,14 @@ get_fundef_copy (tree fun) ...@@ -1013,12 +1025,14 @@ get_fundef_copy (tree fun)
return copy; return copy;
} }
/* Save the copy COPY of function FUN for later reuse by get_fundef_copy(). */ /* Save the copy COPY of function FUN for later reuse by
get_fundef_copy(). By construction, there will always be an entry
to find. */
static void static void
save_fundef_copy (tree fun, tree copy) save_fundef_copy (tree fun, tree copy)
{ {
tree *slot = &fundef_copies_table->get_or_insert (fun, NULL); tree *slot = fundef_copies_table->get (fun);
TREE_CHAIN (copy) = *slot; TREE_CHAIN (copy) = *slot;
*slot = copy; *slot = copy;
} }
......
2016-04-27 Nathan Sidwell <nathan@acm.org>
* g++.dg/cpp0x/constexpr-recursion3.C: New.
* g++.dg/ubsan/pr63956.C: Adjust error location.
2016-04-27 Nick Clifton <nickc@redhat.com> 2016-04-27 Nick Clifton <nickc@redhat.com>
PR middle-end/49889 PR middle-end/49889
......
// { dg-do compile { target c++11 } }
constexpr int Foo (int i)
{
return (i ? Foo (i - 1): 0) + i;
}
static int a = Foo (0);
static int b = Foo (1);
static int d = Foo (3);
static int c = Foo (2);
static int e = Foo (4);
static int g = Foo (6);
static int f = Foo (5);
...@@ -92,7 +92,7 @@ constexpr int ...@@ -92,7 +92,7 @@ constexpr int
fn6 (const int &a, int b) fn6 (const int &a, int b)
{ {
if (b != 2) if (b != 2)
b = a; b = a; // { dg-error "is not a constant expression" }
return b; return b;
} }
...@@ -106,7 +106,7 @@ fn7 (const int *a, int b) ...@@ -106,7 +106,7 @@ fn7 (const int *a, int b)
constexpr int n1 = 7; constexpr int n1 = 7;
constexpr int n2 = fn7 (&n1, 5); constexpr int n2 = fn7 (&n1, 5);
constexpr int n3 = fn7 ((const int *) 0, 8); // { dg-error "is not a constant expression" } constexpr int n3 = fn7 ((const int *) 0, 8);
constexpr int constexpr int
fn8 (int i) fn8 (int i)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment