Tested x86_64-pc-linux-gnu, applying to trunk. -- 8< --
Generally we expect TPARMS_PRIMARY_TEMPLATE to be set, but sometimes it isn't for partial instantiations. This ought to be improved, but it's trivial to work around it in this case. PR c++/108468 gcc/cp/ChangeLog: * pt.cc (unify_pack_expansion): Check that TPARMS_PRIMARY_TEMPLATE is non-null. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/var-templ78.C: New test. --- gcc/cp/pt.cc | 2 ++ gcc/testsuite/g++.dg/cpp1y/var-templ78.C | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/var-templ78.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 65341c40f97..c53d8e279c6 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -24148,6 +24148,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, arguments if it is not otherwise deduced. */ if (cxx_dialect >= cxx20 && TREE_VEC_LENGTH (new_args) < TREE_VEC_LENGTH (old_args) + /* FIXME This isn't set properly for partial instantiations. */ + && TPARMS_PRIMARY_TEMPLATE (tparms) && builtin_guide_p (TPARMS_PRIMARY_TEMPLATE (tparms))) TREE_VEC_LENGTH (old_args) = TREE_VEC_LENGTH (new_args); if (!comp_template_args (old_args, new_args, diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ78.C b/gcc/testsuite/g++.dg/cpp1y/var-templ78.C new file mode 100644 index 00000000000..48366c92775 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ78.C @@ -0,0 +1,12 @@ +// PR c++/108468 +// { dg-do compile { target c++14 } } + +template<int> struct C { + template<class, class> + static constexpr int x = 1; +}; + +template<int I> template<class... A> +int C<I>::x<void(A...), void(A...)> = 2; + +int y = C<0>::x<void(int), void()>; base-commit: 2b204accd07a3185b58b1edc6e9b019472857a5d -- 2.31.1