diff options
author | Jason Merrill <jason@redhat.com> | 2017-01-18 11:44:27 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-01-18 11:44:27 -0500 |
commit | e3aeb9d39a884f805978f832ef92d817e114bfe9 (patch) | |
tree | aebf2c0583455aefc3774ee85d733e1f8cbb35e0 /gcc | |
parent | 5807fb918d557400fd50431c1399cf1f131670ba (diff) | |
download | gcc-e3aeb9d39a884f805978f832ef92d817e114bfe9.zip gcc-e3aeb9d39a884f805978f832ef92d817e114bfe9.tar.gz gcc-e3aeb9d39a884f805978f832ef92d817e114bfe9.tar.bz2 |
PR c++/78894 - ICE with class deduction and default arg
* pt.c (build_deduction_guide): Set DECL_PRIMARY_TEMPLATE.
From-SVN: r244582
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/class-deduction24.C | 14 |
3 files changed, 27 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7e8c465..2fa2e1e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2017-01-17 Jason Merrill <jason@redhat.com> + + PR c++/78894 - ICE with class deduction and default arg + * pt.c (build_deduction_guide): Set DECL_PRIMARY_TEMPLATE. + 2017-01-18 Markus Trippelsdorf <markus@trippelsdorf.de> PR c++/77489 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 022ffda..6fd03a5 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -24968,6 +24968,13 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) current_template_parms = save_parms; --processing_template_decl; } + else + { + /* Copy the parms so we can set DECL_PRIMARY_TEMPLATE. */ + tparms = copy_node (tparms); + INNERMOST_TEMPLATE_PARMS (tparms) + = copy_node (INNERMOST_TEMPLATE_PARMS (tparms)); + } tree fntype = build_function_type (type, fparms); tree ded_fn = build_lang_decl_loc (DECL_SOURCE_LOCATION (ctor), @@ -24978,6 +24985,7 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) DECL_TEMPLATE_RESULT (ded_tmpl) = ded_fn; TREE_TYPE (ded_tmpl) = TREE_TYPE (ded_fn); DECL_TEMPLATE_INFO (ded_fn) = build_template_info (ded_tmpl, targs); + DECL_PRIMARY_TEMPLATE (ded_tmpl) = ded_tmpl; if (ci) set_constraints (ded_tmpl, ci); diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction24.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction24.C new file mode 100644 index 0000000..ba2015a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction24.C @@ -0,0 +1,14 @@ +// PR c++/78894 +// { dg-options -std=c++1z } + +struct A +{ + A (); +}; +template <typename T> +struct C +{ + C (int, const T &, const A & = A ()); +}; + +C a = { 0, 0 }; |