The members of an explicit specialization of a class template don't have the
template parameters of that class template, so we shouldn't try to provide
arguments for them. Only set outer_args when the class is an instantiation.
* pt.c (do_class_deduction): Don't include explicit specialization
args in outer_args.
From-SVN: r269093
2019-02-21 Jason Merrill <jason@redhat.com>
+ PR c++/88869 - C++17 ICE with CTAD and explicit specialization.
+ * pt.c (do_class_deduction): Don't include explicit specialization
+ args in outer_args.
+
PR c++/89422 - ICE with -g and lambda in default arg in template.
* pt.c (tsubst_function_decl): SET_DECL_FRIEND_CONTEXT sooner.
tree outer_args = NULL_TREE;
if (DECL_CLASS_SCOPE_P (tmpl)
- && CLASSTYPE_TEMPLATE_INFO (DECL_CONTEXT (tmpl)))
+ && CLASSTYPE_TEMPLATE_INSTANTIATION (DECL_CONTEXT (tmpl)))
{
outer_args = CLASSTYPE_TI_ARGS (DECL_CONTEXT (tmpl));
type = TREE_TYPE (most_general_template (tmpl));
--- /dev/null
+// PR c++/88869
+// { dg-do compile { target c++17 } }
+
+template <typename> struct B;
+template <> struct B<int> {
+ template <typename T> struct C {
+ T e;
+ C (T f) : e(f) {}
+ };
+ void foo () { C c (42); }
+};