aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-12-19 17:22:36 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-12-19 17:22:36 -0500
commit502bfcbc801fee24af5c1a015a4799c443b2a08e (patch)
treee718fba75891708d652dfa395976e9ddea93652e
parenta1906e8bbfa426ed1adfe751608bc74f1d4d2ab7 (diff)
downloadgcc-502bfcbc801fee24af5c1a015a4799c443b2a08e.zip
gcc-502bfcbc801fee24af5c1a015a4799c443b2a08e.tar.gz
gcc-502bfcbc801fee24af5c1a015a4799c443b2a08e.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c28
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/fntmpdefarg4.C6
3 files changed, 19 insertions, 20 deletions
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 <jason@redhat.com>
+
+ PR c++/55724
+ * pt.c (type_unification_real): Re-combine post-deduction loops.
+
2012-12-14 Jason Merrill <jason@redhat.com>
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<int N> struct S {};
+template<typename T = int, T N> void f(S<N>) {}
+int main() { S<1> s; f(s); }