summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-tree.h8
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--libstdc++-v3/testsuite/20_util/bind/57899.cc48
4 files changed, 63 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 625a880d551..223e1f3f661 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2014-01-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/57899
+ * cp-tree.h (struct saved_scope): Add x_local_specializations.
+ (local_specializations): New macro.
+ * pt.c (local_specializations): Remove variable.
+
2014-01-30 Richard Sandiford <rdsandiford@googlemail.com>
PR c++/58708
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 7f4649903fb..7681b27ca4d 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1049,6 +1049,8 @@ struct GTY(()) saved_scope {
cp_binding_level *class_bindings;
cp_binding_level *bindings;
+ struct pointer_map_t *x_local_specializations;
+
struct saved_scope *prev;
};
@@ -1098,6 +1100,12 @@ struct GTY(()) saved_scope {
#define previous_class_level scope_chain->x_previous_class_level
+/* A map from local variable declarations in the body of the template
+ presently being instantiated to the corresponding instantiated
+ local variables. */
+
+#define local_specializations scope_chain->x_local_specializations
+
/* A list of private types mentioned, for deferred access checking. */
extern GTY(()) struct saved_scope *scope_chain;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 4a5b6cc0684..981e2e0b2ed 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -78,11 +78,6 @@ static GTY(()) tree saved_access_scope;
to the EXPR_STMT that is its result. */
static tree cur_stmt_expr;
-/* A map from local variable declarations in the body of the template
- presently being instantiated to the corresponding instantiated
- local variables. */
-static struct pointer_map_t *local_specializations;
-
/* True if we've recursed into fn_type_unification too many times. */
static bool excessive_deduction_depth;
diff --git a/libstdc++-v3/testsuite/20_util/bind/57899.cc b/libstdc++-v3/testsuite/20_util/bind/57899.cc
new file mode 100644
index 00000000000..d46d53e83fa
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bind/57899.cc
@@ -0,0 +1,48 @@
+// Copyright (C) 2010-2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 20.7.11 Function template bind
+
+// PR c++/57899
+// { dg-do compile }
+// { dg-options -std=c++11 }
+
+#include <functional>
+using std::bind;
+using std::placeholders::_1;
+
+struct S { int i; };
+
+struct P { S s; };
+
+struct get_s
+{
+ const S& operator()(const P& p) const { return p.s; }
+} gs;
+
+int gi(const S& s) { return s.i; }
+
+bool cmp(int, int) { return true; }
+
+int main()
+{
+ P p{};
+ auto f1 = bind(gs, _1);
+ auto f2 = bind(gi, f1);
+ auto f3 = bind(cmp, f2, 5);
+ f3(p);
+}
OpenPOWER on IntegriCloud