C++ PATCH for c++/89612 - ICE with member friend template with noexcept
Marek Polacek
polacek@redhat.com
Tue Mar 19 16:02:00 GMT 2019
On Thu, Mar 14, 2019 at 04:22:41PM -0400, Jason Merrill wrote:
> On 3/7/19 4:52 PM, Marek Polacek wrote:
> > This was one of those PRs where the more you poke, the more ICEs turn up.
> > This patch fixes the ones I could find. The original problem was that
> > maybe_instantiate_noexcept got a TEMPLATE_DECL created for the member
> > friend template in do_friend. Its noexcept-specification was deferred,
> > so we went to the block with push_access_scope, but that crashes on a
> > TEMPLATE_DECL. One approach could be to somehow not defer noexcept-specs
> > for friend templates, I guess, but I didn't want to do that.
>
> How does it make sense to instantiate the noexcept-specifier of a template?
> We should only get there for fully-instantiated function decls.
Hmm, but duplicate_decls calls check_redeclaration_exception_specification even
for DECL_FUNCTION_TEMPLATE_Ps.
It's likely I got this wrong, but I thought template friends are somewhat
special, and they are wrapped in a TEMPLATE_DECL even when it's not an
instantiation. If I have this
template <typename>
class C {
int n;
template <int N>
friend int foo(C);
};
template <int N>
int foo(C<int> c)
{
return c.n;
}
void
g ()
{
C<int> c;
foo<0>(c);
}
then we call instantiate_class_template for C, which calls tsubst_friend_function
on the TEMPLATE_DECL foo, but that remains a TEMPLATE_DECL, unlike for member
template functions. Here's a related patch:
https://gcc.gnu.org/ml/gcc-patches/2014-01/msg01918.html
Note the crash happens in tsubst_friend_function. I wouldn't know when to
check the noexcept-specifier of such a TEMPLATE_DECL for a template friend
if not there.
> > Lastly, I found an invalid testcase that was breaking because a template code
> > leaked to constexpr functions. This I fixed similarly to the recent explicit
> > PR fix (r269131).
>
> This spot should probably also use build_converted_constant_expr.
Ok, I'll address this.
Marek
More information about the Gcc-patches
mailing list