Forgot to cc mailing list:
---------- Forwarded message ----------
Hi,
On Sat, Aug 1, 2009 at 22:06, Eli Friedman <[email protected]> wrote:
> Sorry for the delay.
No worry :)
>
>
> + // If it's packed, check if it fits a char or short.
> + if (Packed && NumNegativeBits <= CharWidth && NumPositiveBits <
> CharWidth) {
> + BestType = Context.SignedCharTy;
> + BestWidth = CharWidth;
> + } else if (Packed && NumNegativeBits <= ShortWidth &&
> NumPositiveBits < ShortWidth) {
> + BestType = Context.ShortTy;
> + BestWidth = ShortWidth;
> + }
> // If there is a negative value, figure out the smallest integer type
> (of
> // int/long/longlong) that fits.
> - if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
> + else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
>
> Having a comment in the middle of the if statement is a bit awkward;
> it would be nice to merge the two comments.
Yeah, should be fixed now.
Otherwise, looks fine.
>
Yay!
>
> -Eli
>
> On Sat, Aug 1, 2009 at 12:26 PM, Anders Johnsen<[email protected]> wrote:
> > Bump :)
> >
> > On Sun, Jul 26, 2009 at 23:52, Anders Johnsen <[email protected]> wrote:
> >>
> >> Hi,
> >>
> >> This patch should implement packed enums (PR4098).
> >>
> >> - Anders
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > [email protected]
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> >
> >
>
- Anders
Index: include/clang/Parse/Action.h
===================================================================
--- include/clang/Parse/Action.h (revision 78193)
+++ include/clang/Parse/Action.h (working copy)
@@ -507,7 +507,8 @@
}
virtual void ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
SourceLocation RBraceLoc, DeclPtrTy EnumDecl,
- DeclPtrTy *Elements, unsigned NumElements) {}
+ DeclPtrTy *Elements, unsigned NumElements,
+ Scope *S, AttributeList *AttrList) {}
//===--------------------------------------------------------------------===//
// Statement Parsing Callbacks.
Index: lib/Frontend/PrintParserCallbacks.cpp
===================================================================
--- lib/Frontend/PrintParserCallbacks.cpp (revision 78193)
+++ lib/Frontend/PrintParserCallbacks.cpp (working copy)
@@ -245,7 +245,8 @@
virtual void ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
SourceLocation RBraceLoc, DeclPtrTy EnumDecl,
- DeclPtrTy *Elements, unsigned NumElements) {
+ DeclPtrTy *Elements, unsigned NumElements,
+ Scope *S, AttributeList *AttrList) {
Out << __FUNCTION__ << "\n";
}
Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
===================================================================
--- lib/Sema/SemaTemplateInstantiateDecl.cpp (revision 78193)
+++ lib/Sema/SemaTemplateInstantiateDecl.cpp (working copy)
@@ -282,9 +282,11 @@
}
// FIXME: Fixup LBraceLoc and RBraceLoc
+ // FIXME: Empty Scope and AttributeList (required to handle attribute packed).
SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(), SourceLocation(),
Sema::DeclPtrTy::make(Enum),
- &Enumerators[0], Enumerators.size());
+ &Enumerators[0], Enumerators.size(),
+ 0, 0);
return Enum;
}
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp (revision 78193)
+++ lib/Sema/SemaDecl.cpp (working copy)
@@ -5013,14 +5013,20 @@
void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
SourceLocation RBraceLoc, DeclPtrTy EnumDeclX,
- DeclPtrTy *Elements, unsigned NumElements) {
+ DeclPtrTy *Elements, unsigned NumElements,
+ Scope *S, AttributeList *Attr) {
EnumDecl *Enum = cast<EnumDecl>(EnumDeclX.getAs<Decl>());
QualType EnumType = Context.getTypeDeclType(Enum);
+
+ if (Attr)
+ ProcessDeclAttributeList(S, Enum, Attr);
// TODO: If the result value doesn't fit in an int, it must be a long or long
// long value. ISO C does not support this, but GCC does as an extension,
// emit a warning.
unsigned IntWidth = Context.Target.getIntWidth();
+ unsigned CharWidth = Context.Target.getCharWidth();
+ unsigned ShortWidth = Context.Target.getShortWidth();
// Verify that all the values are okay, compute the size of the values, and
// reverse the list.
@@ -5062,14 +5068,25 @@
}
// Figure out the type that should be used for this enum.
- // FIXME: Support attribute(packed) on enums and -fshort-enums.
+ // FIXME: Support -fshort-enums.
QualType BestType;
unsigned BestWidth;
-
+
+ bool Packed = Enum->getAttr<PackedAttr>() ? true : false;
+
if (NumNegativeBits) {
// If there is a negative value, figure out the smallest integer type (of
// int/long/longlong) that fits.
- if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
+ // If it's packed, check also if it fits a char or a short.
+ if (Packed && NumNegativeBits <= CharWidth && NumPositiveBits < CharWidth) {
+ BestType = Context.SignedCharTy;
+ BestWidth = CharWidth;
+ } else if (Packed && NumNegativeBits <= ShortWidth &&
+ NumPositiveBits < ShortWidth) {
+ BestType = Context.ShortTy;
+ BestWidth = ShortWidth;
+ }
+ else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
BestType = Context.IntTy;
BestWidth = IntWidth;
} else {
@@ -5088,7 +5105,15 @@
} else {
// If there is no negative value, figure out which of uint, ulong, ulonglong
// fits.
- if (NumPositiveBits <= IntWidth) {
+ // If it's packed, check also if it fits a char or a short.
+ if (Packed && NumPositiveBits <= CharWidth) {
+ BestType = Context.UnsignedCharTy;
+ BestWidth = CharWidth;
+ } else if (Packed && NumPositiveBits <= ShortWidth) {
+ BestType = Context.UnsignedShortTy;
+ BestWidth = ShortWidth;
+ }
+ else if (NumPositiveBits <= IntWidth) {
BestType = Context.UnsignedIntTy;
BestWidth = IntWidth;
} else if (NumPositiveBits <=
Index: lib/Sema/Sema.h
===================================================================
--- lib/Sema/Sema.h (revision 78193)
+++ lib/Sema/Sema.h (working copy)
@@ -619,7 +619,8 @@
SourceLocation EqualLoc, ExprTy *Val);
virtual void ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
SourceLocation RBraceLoc, DeclPtrTy EnumDecl,
- DeclPtrTy *Elements, unsigned NumElements);
+ DeclPtrTy *Elements, unsigned NumElements,
+ Scope *S, AttributeList *Attr);
DeclContext *getContainingDC(DeclContext *DC);
Index: lib/Parse/ParseDecl.cpp
===================================================================
--- lib/Parse/ParseDecl.cpp (revision 78193)
+++ lib/Parse/ParseDecl.cpp (working copy)
@@ -1700,14 +1700,15 @@
// Eat the }.
SourceLocation RBraceLoc = MatchRHSPunctuation(tok::r_brace, LBraceLoc);
- Actions.ActOnEnumBody(StartLoc, LBraceLoc, RBraceLoc, EnumDecl,
- EnumConstantDecls.data(), EnumConstantDecls.size());
-
- Action::AttrTy *AttrList = 0;
+ AttributeList *Attr = 0;
// If attributes exist after the identifier list, parse them.
if (Tok.is(tok::kw___attribute))
- AttrList = ParseAttributes(); // FIXME: where do they do?
+ Attr = ParseAttributes();
+ Actions.ActOnEnumBody(StartLoc, LBraceLoc, RBraceLoc, EnumDecl,
+ EnumConstantDecls.data(), EnumConstantDecls.size(),
+ CurScope, Attr);
+
EnumScope.Exit();
Actions.ActOnTagFinishDefinition(CurScope, EnumDecl, RBraceLoc);
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits