mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
e3b205be21
commit
eaccea2afa
|
|
@ -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.
|
||||
|
|
|
|||
13
gcc/cp/pt.c
13
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. */
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue