From e8ef9fdfb9fd4b16169377a7c65309bb110a0064 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 27 Feb 2018 12:26:47 -0500 Subject: [PATCH] PR c++/84489 - dependent default template argument * pt.c (type_unification_real): Handle early substitution failure. From-SVN: r258039 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 21 ++++++++++++++------- gcc/testsuite/g++.dg/cpp0x/fntmpdefarg7.C | 10 ++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/fntmpdefarg7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dd35f1bda52..b2973d1b301 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-02-27 Jason Merrill + + PR c++/84489 - dependent default template argument + * pt.c (type_unification_real): Handle early substitution failure. + 2018-02-26 Jason Merrill PR c++/84560 - ICE capturing multi-dimensional VLA. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 42fd872d6c0..a3da40912d6 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19831,21 +19831,28 @@ type_unification_real (tree tparms, continue; tree parm = TREE_VALUE (tparm); - if (TREE_CODE (parm) == PARM_DECL - && uses_template_parms (TREE_TYPE (parm)) - && saw_undeduced < 2) - continue; + tsubst_flags_t fcomplain = complain; + if (saw_undeduced == 1) + { + /* When saw_undeduced == 1, substitution into parm and arg might + fail or not replace all template parameters, and that's + fine. */ + fcomplain = tf_none; + if (TREE_CODE (parm) == PARM_DECL + && uses_template_parms (TREE_TYPE (parm))) + continue; + } tree arg = TREE_PURPOSE (tparm); reopen_deferring_access_checks (*checks); location_t save_loc = input_location; if (DECL_P (parm)) input_location = DECL_SOURCE_LOCATION (parm); - arg = tsubst_template_arg (arg, full_targs, complain, NULL_TREE); - if (!uses_template_parms (arg)) + arg = tsubst_template_arg (arg, full_targs, fcomplain, NULL_TREE); + if (arg != error_mark_node && !uses_template_parms (arg)) arg = convert_template_argument (parm, arg, full_targs, complain, i, NULL_TREE); - else if (saw_undeduced < 2) + else if (saw_undeduced == 1) arg = NULL_TREE; else arg = error_mark_node; diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg7.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg7.C new file mode 100644 index 00000000000..636bf1afd88 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg7.C @@ -0,0 +1,10 @@ +// PR c++/84489 +// { dg-do compile { target c++11 } } + +template > 1)> +T f1() {return 0;} + +int main() +{ + f1(); // Bug here +} -- 2.30.2