From 502bfcbc801fee24af5c1a015a4799c443b2a08e Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 19 Dec 2012 17:22:36 -0500 Subject: re PR c++/55724 ([C++11] Default type of a template value is not working) PR c++/55724 * pt.c (type_unification_real): Re-combine post-deduction loops. From-SVN: r194620 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 28 ++++++++-------------------- gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C | 6 ++++++ 3 files changed, 19 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 83d3c63..f6abef6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-12-19 Jason Merrill + + PR c++/55724 + * pt.c (type_unification_real): Re-combine post-deduction loops. + 2012-12-14 Jason Merrill PR c++/55685 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a21522b..1b3f039 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -15333,13 +15333,19 @@ type_unification_real (tree tparms, ? tf_warning_or_error : tf_none); - /* Check to see if we need another pass before we start clearing - ARGUMENT_PACK_INCOMPLETE_P. */ for (i = 0; i < ntparms; i++) { tree targ = TREE_VEC_ELT (targs, i); tree tparm = TREE_VEC_ELT (tparms, i); + /* Clear the "incomplete" flags on all argument packs now so that + substituting them into later default arguments works. */ + if (targ && ARGUMENT_PACK_P (targ)) + { + ARGUMENT_PACK_INCOMPLETE_P (targ) = 0; + ARGUMENT_PACK_EXPLICIT_ARGS (targ) = NULL_TREE; + } + if (targ || tparm == error_mark_node) continue; tparm = TREE_VALUE (tparm); @@ -15352,24 +15358,6 @@ type_unification_real (tree tparms, && uses_template_parms (TREE_TYPE (tparm)) && !saw_undeduced++) goto again; - } - - for (i = 0; i < ntparms; i++) - { - tree targ = TREE_VEC_ELT (targs, i); - tree tparm = TREE_VEC_ELT (tparms, i); - - /* Clear the "incomplete" flags on all argument packs now so that - substituting them into later default arguments works. */ - if (targ && ARGUMENT_PACK_P (targ)) - { - ARGUMENT_PACK_INCOMPLETE_P (targ) = 0; - ARGUMENT_PACK_EXPLICIT_ARGS (targ) = NULL_TREE; - } - - if (targ || tparm == error_mark_node) - continue; - tparm = TREE_VALUE (tparm); /* Core issue #226 (C++0x) [temp.deduct]: diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C new file mode 100644 index 0000000..0248b60 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C @@ -0,0 +1,6 @@ +// PR c++/55724 +// { dg-options -std=c++11 } + +template struct S {}; +template void f(S) {} +int main() { S<1> s; f(s); } -- cgit v1.1