Commit eaccea2a by Jason Merrill Committed by Jason Merrill

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
parent e3b205be
2012-06-25 Jason Merrill <jason@redhat.com> 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 PR c++/52988
* typeck.c (decay_conversion): Don't discard side-effects from * typeck.c (decay_conversion): Don't discard side-effects from
expressions of nullptr_t. expressions of nullptr_t.
......
...@@ -10497,7 +10497,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) ...@@ -10497,7 +10497,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
DECL_CHAIN (prev_r) = r; 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, DECL_CHAIN (r) = tsubst (DECL_CHAIN (t), args,
complain, DECL_CHAIN (t)); complain, DECL_CHAIN (t));
...@@ -12078,8 +12080,6 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -12078,8 +12080,6 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (r == NULL_TREE) if (r == NULL_TREE)
{ {
tree c;
/* We get here for a use of 'this' in an NSDMI. */ /* We get here for a use of 'this' in an NSDMI. */
if (DECL_NAME (t) == this_identifier if (DECL_NAME (t) == this_identifier
&& at_function_scope_p () && at_function_scope_p ()
...@@ -12090,12 +12090,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -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 declaration (such as in a late-specified return type). Just
make a dummy decl, since it's only used for its type. */ make a dummy decl, since it's only used for its type. */
gcc_assert (cp_unevaluated_operand != 0); gcc_assert (cp_unevaluated_operand != 0);
/* We copy T because want to tsubst the PARM_DECL only, r = tsubst_decl (t, args, complain);
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;
/* Give it the template pattern as its context; its true context /* Give it the template pattern as its context; its true context
hasn't been instantiated yet and this is good enough for hasn't been instantiated yet and this is good enough for
mangling. */ mangling. */
......
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> 2012-06-25 Janis Johnson <janisjo@codesourcery.com>
* lib/target-supports-dg.exp (testname-for-summary): New. * lib/target-supports-dg.exp (testname-for-summary): New.
......
// 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;
}
...@@ -9,11 +9,11 @@ struct funct ...@@ -9,11 +9,11 @@ struct funct
int operator()(argTs...); int operator()(argTs...);
}; };
template<class...> class test; template<class...> struct test;
template<template <class...> class tp, template<template <class...> class tp,
class... arg1Ts, class... arg2Ts> class... arg1Ts, class... arg2Ts>
class test<tp<arg1Ts...>, tp<arg2Ts...>> struct test<tp<arg1Ts...>, tp<arg2Ts...>>
{ {
template<class func, class...arg3Ts> template<class func, class...arg3Ts>
auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s) auto test2(func fun, arg1Ts... arg1s, arg3Ts... arg3s)
...@@ -23,5 +23,5 @@ class test<tp<arg1Ts...>, tp<arg2Ts...>> ...@@ -23,5 +23,5 @@ class test<tp<arg1Ts...>, tp<arg2Ts...>>
int main() int main()
{ {
test<tuple<>, tuple<char,int>> t2; test<tuple<>, tuple<char,int>> t2;
t2.test2(funct(), 'a', 2); // { dg-error "no matching function" } t2.test2(funct(), 'a', 2);
} }
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