Commit 157420b4 by Jason Merrill Committed by Jason Merrill

PR c++/80174 - ICE with partial specialization of member template.

	PR c++/71747
	* pt.c (get_partial_spec_bindings): Only coerce innermost args.

From-SVN: r249319
parent 3eec359d
2017-06-16 Jason Merrill <jason@redhat.com>
PR c++/80174 - ICE with partial specialization of member template.
PR c++/71747
* pt.c (get_partial_spec_bindings): Only coerce innermost args.
PR c++/80831 - ICE with -fsyntax-only.
* decl2.c (c_parse_final_cleanups): Use cgraph_node::get_create.
......
......@@ -21672,9 +21672,11 @@ get_partial_spec_bindings (tree tmpl, tree spec_tmpl, tree args)
`T' is `A' but unify () does not check whether `typename T::X'
is `int'. */
spec_args = tsubst (spec_args, deduced_args, tf_none, NULL_TREE);
spec_args = coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
spec_args, tmpl,
tf_none, false, false);
if (spec_args != error_mark_node)
spec_args = coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
INNERMOST_TEMPLATE_ARGS (spec_args),
tmpl, tf_none, false, false);
pop_tinst_level ();
......
// PR c++/80174
typedef unsigned char uint8_t;
template <typename T>
struct HighestMaxFieldIdx {
static const uint8_t maxFieldIdx = T::fieldIdx;
};
template <typename This>
struct Outer {
template <uint8_t _fieldIdx, typename T, T This::*field>
struct Varint {};
template <uint8_t _fieldIdx, uint8_t This::*field>
struct Varint<_fieldIdx, uint8_t, field> {
static const uint8_t fieldIdx = _fieldIdx;
};
};
struct Msg {
uint8_t a;
static const uint8_t t
= HighestMaxFieldIdx<Outer<Msg>::Varint<1, uint8_t, &Msg::a> >::maxFieldIdx;
};
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