On Tue, Jan 17, 2017 at 1:20 PM, Nathan Sidwell <nat...@acm.org> wrote:
> Jason,
> in r241944:
> 2016-11-07  Jason Merrill  <ja...@redhat.com>
>
>         Implement P0012R1, Make exception specifications part of the type
>         system.
>
> You increment processing_template_decl around the mangling of a template
> function decl.  AFAICT, that's so that nothrow_spec_p doesn't explode at:
>   gcc_assert (processing_template_decl
>               || TREE_PURPOSE (spec) == error_mark_node);
> when called from the mangler at:
>   if (nothrow_spec_p (spec))
>     write_string ("Do");
>   else if (TREE_PURPOSE (spec))
>     ....
>
> the trouble is that's now causing no_linkage_check to bail out early with:
>   if (processing_template_decl)
>     return NULL_TREE;
>
> thus triggering the assert:
>      gcc_assert (no_linkage_check (type, /*relaxed_p=*/true));
>       /* Just use the old mangling at namespace scope.  */
>
> It seems to me risky to have processsing_template_decl incremented, as
> no_linkage_check is called from a number of places in the mangler.

Makes sense.

> Thus the
> attached patch, which adds a default arg to nothrow_spec_p to tell it to be
> a little more lenient.
>
> In the old days, I'd've made nothrow_spec_p an asserting wrapper for a
> non-asserting function, and called that non-asserting function from the
> mangler.  But we can use default arg magic to avoid adjusting all the other
> call sites.  I'm fine with doing it the wrapper way, if you'd prefer.
>
> ok?

Hmm, what if write_exception_spec checks for a dependent
noexcept-specifier first, and noexcept_spec_p second?  That seems like
it would avoid needing any change to nothrow_spec_p.

Jason

Reply via email to