aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-06-25 23:42:34 -0400
committerJason Merrill <jason@gcc.gnu.org>2012-06-25 23:42:34 -0400
commiteaccea2afa9be40d1d976292da8450cb36439d5f (patch)
tree03502474e28bb6b741afb1fb232702d106dc3b42
parente3b205be21d6d891e9c1e7942d57af1c510d49fd (diff)
downloadgcc-eaccea2afa9be40d1d976292da8450cb36439d5f.zip
gcc-eaccea2afa9be40d1d976292da8450cb36439d5f.tar.gz
gcc-eaccea2afa9be40d1d976292da8450cb36439d5f.tar.bz2
re PR c++/53498 (Compiler crashes during C++11 template magic compilation)
PR c++/53498 PR c++/53305 * pt.c (tsubst_decl) [PARM_DECL]: Don't recurse into DECL_CHAIN if cp_unevaluated_operand is set. (tsubst_copy) [PARM_DECL]: Don't copy before tsubsting. From-SVN: r188973
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype38.C17
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic132.C6
5 files changed, 37 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2d321b0..e80d3dc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
2012-06-25 Jason Merrill <jason@redhat.com>
+ PR c++/53498
+ PR c++/53305
+ * pt.c (tsubst_decl) [PARM_DECL]: Don't recurse into DECL_CHAIN
+ if cp_unevaluated_operand is set.
+ (tsubst_copy) [PARM_DECL]: Don't copy before tsubsting.
+
PR c++/52988
* typeck.c (decay_conversion): Don't discard side-effects from
expressions of nullptr_t.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index ad7134b..7e1c46f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10497,7 +10497,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
DECL_CHAIN (prev_r) = r;
}
- if (DECL_CHAIN (t))
+ /* If cp_unevaluated_operand is set, we're just looking for a
+ single dummy parameter, so don't keep going. */
+ if (DECL_CHAIN (t) && !cp_unevaluated_operand)
DECL_CHAIN (r) = tsubst (DECL_CHAIN (t), args,
complain, DECL_CHAIN (t));
@@ -12078,8 +12080,6 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (r == NULL_TREE)
{
- tree c;
-
/* We get here for a use of 'this' in an NSDMI. */
if (DECL_NAME (t) == this_identifier
&& at_function_scope_p ()
@@ -12090,12 +12090,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
declaration (such as in a late-specified return type). Just
make a dummy decl, since it's only used for its type. */
gcc_assert (cp_unevaluated_operand != 0);
- /* We copy T because want to tsubst the PARM_DECL only,
- not the following PARM_DECLs that are chained to T. */
- c = copy_node (t);
- r = tsubst_decl (c, args, complain);
- if (r == NULL_TREE)
- return error_mark_node;
+ r = tsubst_decl (t, args, complain);
/* Give it the template pattern as its context; its true context
hasn't been instantiated yet and this is good enough for
mangling. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b4f21e7..a85b990 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-06-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/53498
+ PR c++/53305
+ * g++.dg/cpp0x/decltype38.C: New.
+ * g++.dg/cpp0x/variadic132.C: Remove dg-error.
+
2012-06-25 Janis Johnson <janisjo@codesourcery.com>
* lib/target-supports-dg.exp (testname-for-summary): New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype38.C b/gcc/testsuite/g++.dg/cpp0x/decltype38.C
new file mode 100644
index 0000000..97ebb33
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype38.C
@@ -0,0 +1,17 @@
+// PR c++/53498
+// { dg-do compile { target c++11 } }
+
+template<typename... Args>
+struct B
+{
+ template<typename U>
+ static
+ void b(const U& u, const Args&... args,
+ decltype(u.f(args...)) dummy)
+ {
+ }
+};
+
+int main() {
+ B<int> b;
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic132.C b/gcc/testsuite/g++.dg/cpp0x/variadic132.C
index f50c7a6..1b9c286 100644
--- a/gcc/testsuite/g++.dg/cpp0x/variadic132.C
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic132.C
@@ -9,11 +9,11 @@ struct funct
int operator()(argTs...);
};
-template<class...> class test;
+template<class...> struct test;
template<template <class...> class tp,
class... arg1Ts, class... arg2Ts>
-class test<tp<arg1Ts...>, tp<arg2Ts...>>
+struct test<tp<arg1Ts...>, tp<arg2Ts...>>
{
template<class func, class...arg3Ts>
auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s)
@@ -23,5 +23,5 @@ class test<tp<arg1Ts...>, tp<arg2Ts...>>
int main()
{
test<tuple<>, tuple<char,int>> t2;
- t2.test2(funct(), 'a', 2); // { dg-error "no matching function" }
+ t2.test2(funct(), 'a', 2);
}