[cfe-dev] Patch for enum sizes

Chris Lattner clattner at apple.com
Mon Aug 27 10:39:43 PDT 2007


On Aug 26, 2007, at 2:35 AM, Keith Bauer wrote:

> Well, a start, anyway.  Enough to prevent clang asserting when
> switching on an enumerated type, at least.
>
> No idea if this is a sensible approach or not.  Feel free to flame ;)

Seems reasonable:  I applied it with changes, here are some comments:

+  enum EnumTypePolicy {
+    AlwaysInt,
+    ShortestType
+  };

This should be documented as a whole and each element should be as  
well.  I wrote:

   /// EnumTypePolicy - This enum value contains a list of the  
various policies
   /// that a target can have about how enums are converted to  
integer types.
   enum EnumTypePolicy {
     AlwaysInt,      // 'int' or 'unsigned'
     ShortestType    // -fshort-enums
   };



+  /// integerTypeCompatibleWithEnumType - returns the integer type  
compatible
+  /// with the given enum type.
+  QualType integerTypeCompatibleWithEnum(EnumDecl *ED,  
SourceLocation L);

I renamed this to: getEnumDeclIntegerType and made it const.  Also,  
it doesn't need the source location node, because:

+/// integerTypeCompatibleWithEnumType - returns the integer type  
compatible
+/// with the given enum type.
+QualType ASTContext::integerTypeCompatibleWithEnum(EnumDecl *ED,  
SourceLocation L) {
+  Decl *D = ED->getFirstElement();
+  EnumConstantDecl *C = cast<EnumConstantDecl>(D);
...

By the time this is called, all enum constants have to have the same  
type (which is the integer type we want).  I replaced this with:

QualType ASTContext::getEnumDeclIntegerType(EnumDecl *ED) const {
   if (EnumConstantDecl *C = ED->getEnumConstantList())
     return C->getType();

   // If the enum list is empty, it is typed as if it contained a  
single zero
   // element [C++ dcl.enum] and is illegal in C (as an extension, we  
treat it
   // the same as C++ does).
   switch (Target.getEnumTypePolicy(ED->getLocation())) {
   default: assert(0 && "Unknown enum layout policy");
   case TargetInfo::AlwaysInt:    return UnsignedIntTy;   // 0 ->  
unsigned
   case TargetInfo::ShortestType: return UnsignedCharTy;  // 0 ->  
unsigned char
   }
}


I will work on making enum layout follow the GCC conventions next and  
fix some TODO's in the relevant handling code.

Thanks Keith!

-Chris




More information about the cfe-dev mailing list