On Tue, Feb 14, 2017 at 3:13 PM, Jakub Jelinek <[email protected]> wrote:
> The following testcase fails, because while we have the nodiscard
> attribute on the template, we actually never propagate it to the
> instantiation, which is where it is checked (I'm really surprised about
> this).
Normally we propagate attributes when instantiating the class; see the
call to apply_late_template_attributes in
instantiate_class_template_1. I'm not sure why that wouldn't be
happening here; are we calling maybe_warn_nodiscard before
instantiating the class?
> Unfortunately, this patch regresses
> FAIL: g++.dg/ext/visibility/template8.C -std=gnu++{11,14,98} scan-hidden
> hidden[ \\t_]*_Z1gI1AI1BEEvT_
> It expects that the visibility attribute from the template never
> makes it to the implementation or something, is that correct? Or do
> we need to handle visibility in some special way?
Visibility is handled specially; determine_visibility looks up the
visibility of the template if the specialization doesn't specify its
own visibility.
> Regarding the first hunk, it is just a wild guess, I couldn't trigger
> that code by make check-c++-all. Is there a way to get it through
> some partial instantiation of scoped enum with/without attributes or
> something similar?
Hmm, not sure.
> Anyway, except for that template8.C the patch passed bootstrap/regtest
> on x86_64-linux and i686-linux. But it really puzzles me that the
> attributes aren't instantiated, what happens e.g. with abi_tag
> attribute?
abi_tag and may_alias are applied specifically in lookup_class_template_1.
Jason