[PATCH] [Sema] Don't permit dependent alignments on non-dependent typedef-names

Aaron Ballman aaron at aaronballman.com
Mon Apr 6 17:39:56 PDT 2015


On Mon, Apr 6, 2015 at 8:36 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Mon, Apr 6, 2015 at 4:35 PM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>>
>> On Mon, Apr 6, 2015 at 7:30 PM, Richard Smith <richard at metafoo.co.uk>
>> wrote:
>> > ================
>> > Comment at: lib/Sema/SemaDeclAttr.cpp:2866
>> > @@ -2865,1 +2865,3 @@
>> >
>> > +  if (E->isTypeDependent() || E->isValueDependent()) {
>> > +    if (const auto *TND = dyn_cast<TypedefNameDecl>(D)) {
>> > ----------------
>> > The 'type dependent' check here is redundant.
>> >
>> > ================
>> > Comment at: lib/Sema/SemaDeclAttr.cpp:2869
>> > @@ +2868,3 @@
>> > +      QualType T = TND->getUnderlyingType();
>> > +      if (!T->isDependentType() && !T->isInstantiationDependentType())
>> > {
>> > +        S.Diag(Attr.getLoc(),
>> > diag::err_alignment_dependent_typedef_name)
>> > ----------------
>> > I don't think you should check instantiation-dependence here. I think
>> > you should reject this, for instance:
>> >
>> >   template<int N> struct X {
>> >     typedef __attribute__((aligned(N))) int X[sizeof(N)];
>> >   };
>> >
>>
>> Out of curiosity, why do you think that should be rejected?
>
>
> For the same reason we're rejecting anything here: we'd otherwise create a
> non-dependent type that has a dependent alignment.

Huh, I guess I thought this type was dependent because of the
sizeof(N) in the type.

Thanks!

~Aaron



More information about the cfe-commits mailing list