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.
`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 ();
--- /dev/null
+// 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;
+};