+2019-07-01 Marek Polacek <polacek@redhat.com>
+
+ Backported from mainline
+ 2019-06-21 Marek Polacek <polacek@redhat.com>
+
+ PR c++/60223 - ICE with T{} in non-deduced context.
+ * pt.c (unify): Allow COMPOUND_LITERAL_P in a non-deduced context.
+
2019-06-29 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
/* An unresolved overload is a nondeduced context. */
if (is_overloaded_fn (parm) || type_unknown_p (parm))
return unify_success (explain_p);
- gcc_assert (EXPR_P (parm) || TREE_CODE (parm) == TRAIT_EXPR);
+ gcc_assert (EXPR_P (parm)
+ || COMPOUND_LITERAL_P (parm)
+ || TREE_CODE (parm) == TRAIT_EXPR);
expr:
/* We must be looking at an expression. This can happen with
something like:
template <int I>
void foo(S<I>, S<I + 2>);
- This is a "nondeduced context":
+ or
+
+ template<typename T>
+ void foo(A<T, T{}>);
+
+ This is a "non-deduced context":
[deduct.type]
- The nondeduced contexts are:
+ The non-deduced contexts are:
- --A type that is a template-id in which one or more of
- the template-arguments is an expression that references
- a template-parameter.
+ --A non-type template argument or an array bound in which
+ a subexpression references a template parameter.
In these cases, we assume deduction succeeded, but don't
actually infer any unifications. */
--- /dev/null
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T, T = T{}>
+struct A { };
+
+template<typename T>
+void foo(A<T> a);
+
+void bar()
+{
+ foo(A<char, char{}>());
+ foo(A<char>());
+ foo<>(A<char>());
+ foo<>(A<char, char{}>());
+}
--- /dev/null
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T, T>
+struct A { };
+
+template<typename T>
+void foo(A<T, T{}>);
+
+void bar()
+{
+ foo(A<char, char{}>());
+ foo<>(A<char, char{}>());
+}
--- /dev/null
+// PR c++/60223
+// { dg-do compile { target c++11 } }
+
+template<typename T, T = T{1}>
+struct A { };
+
+template<typename T>
+void foo(A<T> a);
+
+void bar()
+{
+ foo(A<char>());
+ foo(A<char, char{1}>());
+ foo<>(A<char>());
+ foo<>(A<char, char{1}>());
+}