diff options
author | Jason Merrill <jason@redhat.com> | 2017-08-29 15:40:21 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-08-29 15:40:21 -0400 |
commit | 82b0ce2eb32bea3d6e35609d1806ba332576826d (patch) | |
tree | 10c63963369aa559008571925b862882ac197a20 | |
parent | a0ab7ccd216184853052cec1bce7900cbdeed0b4 (diff) | |
download | gcc-82b0ce2eb32bea3d6e35609d1806ba332576826d.zip gcc-82b0ce2eb32bea3d6e35609d1806ba332576826d.tar.gz gcc-82b0ce2eb32bea3d6e35609d1806ba332576826d.tar.bz2 |
Support copying local_specializations.
* cp-tree.h (enum lss_policy): New.
(local_specialization_stack): Add policy parameter to default ctor.
* pt.c (local_specialization_stack): Copy local_specializations if
lss_copy.
From-SVN: r251424
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 |
3 files changed, 13 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f91f6be..b4e21f6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2017-08-29 Jason Merrill <jason@redhat.com> + Support copying local_specializations. + * cp-tree.h (enum lss_policy): New. + (local_specialization_stack): Add policy parameter to default ctor. + * pt.c (local_specialization_stack): Copy local_specializations if + lss_copy. + * constexpr.c (potential_constant_expression_1): Add "now" parm. (is_constant_expression, require_constant_expression): New. (is_static_init_expression, is_nondependent_constant_expression) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index f0eafb3..a58e7bd 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5117,9 +5117,10 @@ enum unification_kind_t { // An RAII class used to create a new pointer map for local // specializations. When the stack goes out of scope, the // previous pointer map is restored. +enum lss_policy { lss_blank, lss_copy }; struct local_specialization_stack { - local_specialization_stack (); + local_specialization_stack (lss_policy = lss_blank); ~local_specialization_stack (); hash_map<tree, tree> *saved; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e34fe21..1b726ff 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -77,10 +77,13 @@ static tree cur_stmt_expr; // // Implementation of the RAII helper for creating new local // specializations. -local_specialization_stack::local_specialization_stack () +local_specialization_stack::local_specialization_stack (lss_policy policy) : saved (local_specializations) { - local_specializations = new hash_map<tree, tree>; + if (policy == lss_blank || !saved) + local_specializations = new hash_map<tree, tree>; + else + local_specializations = new hash_map<tree, tree>(*saved); } local_specialization_stack::~local_specialization_stack () |