On Mon, Jan 23, 2017 at 11:15 AM, Paolo Carlini
<paolo.carl...@oracle.com> wrote:
> in this relatively serious ICE on invalid regression (we don't emit any
> message before ICEing) make_typename_type, called by strip_typedefs, returns
> error_mark_node which then isn't handled by typedef_variant_p. Indeed, Jakub
> noticed that the same in principle can happen when strip_typedefs calls
> finish_decltype_type. make_typename_type is passed tf_none therefore cannot
> emit the diagnostic we want before the ICE anyway, thus it seems to me that
> we also have one of those well known issues about not propagating a
> tusbst_flags_t flag: canonicalize_type_argument (and
> canonicalize_expr_argument) get a tusbst_flags_t but doesn't propagate it to
> strip_typedefs (and strip_typedefs_expr).
>
> Implementing the straightforward set of changes, consistently for
> strip_typedefs, strip_typedefs_expr and the related functions plus checking
> the return values of make_typename_type and finish_decltype_type for
> error_mark_node (only make_typename_type would be enough for the testcase at
> issue) appears to solve the problem without introducing regressions. Does
> that make sense?

Hmm.  How did we get the typedef in the first place to a type that we
can't reconstruct?  I would think that instantiating C<int> should
give an error before we get to strip_typedefs.

Jason

Reply via email to