aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-08-29 15:40:21 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-08-29 15:40:21 -0400
commit82b0ce2eb32bea3d6e35609d1806ba332576826d (patch)
tree10c63963369aa559008571925b862882ac197a20
parenta0ab7ccd216184853052cec1bce7900cbdeed0b4 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/pt.c7
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 ()