Commit e8b27b08 by Jason Merrill Committed by Jason Merrill

re PR c++/61539 (ICE: in unify_one_argument, at cp/pt.c:15465)

	PR c++/61539
	* pt.c (unify_one_argument): Type/expression mismatch just causes
	deduction failure.

From-SVN: r212154
parent 71d1add3
2014-06-30 Jason Merrill <jason@redhat.com> 2014-06-30 Jason Merrill <jason@redhat.com>
PR c++/61539
* pt.c (unify_one_argument): Type/expression mismatch just causes
deduction failure.
* semantics.c (simplify_aggr_init_expr): Remove remnants of * semantics.c (simplify_aggr_init_expr): Remove remnants of
2014-04-11 change. 2014-04-11 change.
......
...@@ -16501,8 +16501,9 @@ unify_one_argument (tree tparms, tree targs, tree parm, tree arg, ...@@ -16501,8 +16501,9 @@ unify_one_argument (tree tparms, tree targs, tree parm, tree arg,
maybe_adjust_types_for_deduction (strict, &parm, &arg, arg_expr); maybe_adjust_types_for_deduction (strict, &parm, &arg, arg_expr);
} }
else else
gcc_assert ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL) if ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL)
== (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL)); != (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL))
return unify_template_argument_mismatch (explain_p, parm, arg);
/* For deduction from an init-list we need the actual list. */ /* For deduction from an init-list we need the actual list. */
if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr)) if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
......
// PR c++/61539
// { dg-do compile { target c++11 } }
template <typename _CharT> class A;
template <typename> class B;
template <class charT> class C;
template <> class C<char>
{
virtual void xparse (int &, const B<A<char> > &) const;
};
template <class T, class charT = char> class G : C<charT>
{
public:
G (void *) {}
void default_value (const T &);
void xparse (int &, const B<A<charT> > &) const;
};
template <class T, class charT>
void validate (int &, const B<A<charT> > &, T *, int);
template <class T, class charT>
void G<T, charT>::xparse (int &p1, const B<A<charT> > &p2) const
{
validate (p1, p2, (T *)0, 0);
}
template <class T> G<T> *value (T *) { return new G<T>(0); }
namespace Eigen
{
template <typename T> struct D;
template <typename, int, int, int = 0, int = 0, int = 0 > class F;
template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows,
int _MaxCols>
struct D<F<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
{
typedef _Scalar Scalar;
};
template <typename, int, int, int, int, int _MaxCols> class F
{
public:
typedef typename Eigen::D<F>::Scalar Scalar;
F (const Scalar &, const Scalar &, const Scalar &);
};
template <class... T>
void validate (int &, const B<A<char> > &, Eigen::F<T...> *);
}
int main (int, char *[])
{
Eigen::F<double, 3, 1> a (0, 0, 0);
value (&a)->default_value (Eigen::F<double, 3, 1>(0, 0, 0));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment