r226653 - AST: Don't ignore alignas on EnumDecls when calculating alignment
David Majnemer
david.majnemer at gmail.com
Wed Jan 21 10:25:35 PST 2015
On Wed, Jan 21, 2015 at 9:06 AM, Justin Bogner <mail at justinbogner.com>
wrote:
> David Majnemer <david.majnemer at gmail.com> writes:
> > Author: majnemer
> > Date: Wed Jan 21 04:54:38 2015
> > New Revision: 226653
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=226653&view=rev
> > Log:
> > AST: Don't ignore alignas on EnumDecls when calculating alignment
> >
> > We didn't consider any alignment attributes on an EnumDecl when
> > calculating alignment.
> >
> > While we are here, ignore alignment specifications on typedef types if
> > one is used as the underlying type. Otherwise, weird things happen:
> >
> > enum Y : int;
> > Y y;
> >
> > typedef int __attribute__((aligned(64))) u;
> > enum Y : u {};
> >
> > What is the alignment of 'Y'? It would be more consistent with the
> > overall design of enums with fixed underlying types to consider the
> > underlying type's UnqualifiedDesugaredType.
>
> Is it more consistent?
I think so.
The standard forbids:
typedef int alignas(16) Ty;
enum : int alignas(4) {};
we error with: 'alignas' attribute cannot be applied to types
The standard is pretty clear that alignment isn't a property of types.
We would also match the behavior of MSVC and ICC, they also ignore the
alignment of the underlying type.
> What about the case without the forward
> declaration, or if the forward declaration also specifies the alignment?
>
Then what do we do with:
typedef int __attribute__((aligned(8))) Ty1;
typedef int __attribute__((aligned(16))) Ty2;
enum alignas(16) : Ty1 {};
enum alignas(8) : Ty2 {};
What alignment would Ty1 and Ty2 have? The max of all possible alignments?
Just the alignment on the EnumDecl?
> It's not really clear what the programmer's intent is in these cases
> anyway, maybe we could warn that they seem to be doing something silly?
>
I think a warning would be a fine idea.
>
> > This fixes PR22279.
> >
> > Modified:
> > cfe/trunk/lib/AST/ASTContext.cpp
> > cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> > cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p5.cpp
> > cfe/trunk/test/Sema/align-x86.c
> >
> > Modified: cfe/trunk/lib/AST/ASTContext.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=226653&r1=226652&r2=226653&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> > +++ cfe/trunk/lib/AST/ASTContext.cpp Wed Jan 21 04:54:38 2015
> > @@ -1670,8 +1670,16 @@ TypeInfo ASTContext::getTypeInfoImpl(con
> > break;
> > }
> >
> > - if (const EnumType *ET = dyn_cast<EnumType>(TT))
> > - return getTypeInfo(ET->getDecl()->getIntegerType());
> > + if (const EnumType *ET = dyn_cast<EnumType>(TT)) {
> > + const EnumDecl *ED = ET->getDecl();
> > + TypeInfo Info =
> > +
> getTypeInfo(ED->getIntegerType()->getUnqualifiedDesugaredType());
> > + if (unsigned AttrAlign = ED->getMaxAlignment()) {
> > + Info.Align = AttrAlign;
> > + Info.AlignIsRequired = true;
> > + }
> > + return Info;
> > + }
> >
> > const RecordType *RT = cast<RecordType>(TT);
> > const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
> > @@ -1786,6 +1794,8 @@ unsigned ASTContext::getPreferredTypeAli
> > T = T->getBaseElementTypeUnsafe();
> > if (const ComplexType *CT = T->getAs<ComplexType>())
> > T = CT->getElementType().getTypePtr();
> > + if (const EnumType *ET = T->getAs<EnumType>())
> > + T = ET->getDecl()->getIntegerType().getTypePtr();
> > if (T->isSpecificBuiltinType(BuiltinType::Double) ||
> > T->isSpecificBuiltinType(BuiltinType::LongLong) ||
> > T->isSpecificBuiltinType(BuiltinType::ULongLong))
> >
> > Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=226653&r1=226652&r2=226653&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Jan 21 04:54:38 2015
> > @@ -2953,12 +2953,15 @@ void Sema::AddAlignedAttr(SourceRange At
> > void Sema::CheckAlignasUnderalignment(Decl *D) {
> > assert(D->hasAttrs() && "no attributes on decl");
> >
> > - QualType Ty;
> > - if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
> > - Ty = VD->getType();
> > - else
> > - Ty = Context.getTagDeclType(cast<TagDecl>(D));
> > - if (Ty->isDependentType() || Ty->isIncompleteType())
> > + QualType UnderlyingTy, DiagTy;
> > + if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
> > + UnderlyingTy = DiagTy = VD->getType();
> > + } else {
> > + UnderlyingTy = DiagTy = Context.getTagDeclType(cast<TagDecl>(D));
> > + if (EnumDecl *ED = dyn_cast<EnumDecl>(D))
> > + UnderlyingTy = ED->getIntegerType();
> > + }
> > + if (DiagTy->isDependentType() || DiagTy->isIncompleteType())
> > return;
> >
> > // C++11 [dcl.align]p5, C11 6.7.5/4:
> > @@ -2977,10 +2980,10 @@ void Sema::CheckAlignasUnderalignment(De
> >
> > if (AlignasAttr && Align) {
> > CharUnits RequestedAlign = Context.toCharUnitsFromBits(Align);
> > - CharUnits NaturalAlign = Context.getTypeAlignInChars(Ty);
> > + CharUnits NaturalAlign = Context.getTypeAlignInChars(UnderlyingTy);
> > if (NaturalAlign > RequestedAlign)
> > Diag(AlignasAttr->getLocation(), diag::err_alignas_underaligned)
> > - << Ty << (unsigned)NaturalAlign.getQuantity();
> > + << DiagTy << (unsigned)NaturalAlign.getQuantity();
> > }
> > }
> >
> >
> > Modified: cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p5.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p5.cpp?rev=226653&r1=226652&r2=226653&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p5.cpp (original)
> > +++ cfe/trunk/test/CXX/dcl.dcl/dcl.attr/dcl.align/p5.cpp Wed Jan 21
> 04:54:38 2015
> > @@ -15,6 +15,12 @@ enum alignas(1) E1 {}; // expected-error
> > enum alignas(1) E2 : char {}; // ok
> > enum alignas(4) E3 { e3 = 0 }; // ok
> > enum alignas(4) E4 { e4 = 1ull << 33 }; // expected-error {{requested
> alignment is less than minimum alignment of 8 for type 'E4'}}
> > +enum alignas(8) E5 {};
> > +static_assert(alignof(E5) == 8, "");
> > +
> > +typedef __attribute__((aligned(16))) int IntAlign16;
> > +enum E6 : IntAlign16 {};
> > +static_assert(alignof(E6) == 4, "");
> >
> > struct S1 {
> > alignas(8) int n;
> >
> > Modified: cfe/trunk/test/Sema/align-x86.c
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/align-x86.c?rev=226653&r1=226652&r2=226653&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/Sema/align-x86.c (original)
> > +++ cfe/trunk/test/Sema/align-x86.c Wed Jan 21 04:54:38 2015
> > @@ -27,6 +27,8 @@ double g6[3];
> > short chk1[__alignof__(g6) == 8 ? 1 : -1];
> > short chk2[__alignof__(double[3]) == 8 ? 1 : -1];
> >
> > +enum { x = 18446744073709551615ULL } g7;
> > +short chk1[__alignof__(g7) == 8 ? 1 : -1];
> >
> > // PR5637
> >
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150121/358dce77/attachment.html>
More information about the cfe-commits
mailing list