]> granicus.if.org Git - clang/commitdiff
Change EnumDecl to store its corresponding integer type
authorChris Lattner <sabre@nondot.org>
Tue, 28 Aug 2007 18:24:31 +0000 (18:24 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 28 Aug 2007 18:24:31 +0000 (18:24 +0000)
directly in it.  Remove TargetInfo::getEnumPolicy, as there is only
one policy that we support right now.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41548 91177308-0d34-0410-b5e6-96231b3b80d8

AST/ASTContext.cpp
CodeGen/CodeGenTypes.cpp
Sema/SemaDecl.cpp
include/clang/AST/ASTContext.h
include/clang/AST/Decl.h
include/clang/Basic/TargetInfo.h

index bc737483d2b6d28f0ce19c4cb48ef6a6e940234a..a68ebb5be6517bb2b8892378eb933d268e9e38a3 100644 (file)
@@ -233,7 +233,7 @@ ASTContext::getTypeInfo(QualType T, SourceLocation L) {
       Size = Layout.getSize();
       Align = Layout.getAlignment();
     } else if (EnumDecl *ED = dyn_cast<EnumDecl>(TT->getDecl())) {
-      return getTypeInfo(getEnumDeclIntegerType(ED), L);
+      return getTypeInfo(ED->getIntegerType(), L);
     } else {
       assert(0 && "Unimplemented type sizes!");
     }
@@ -312,23 +312,6 @@ const RecordLayout &ASTContext::getRecordLayout(const RecordDecl *D,
   return *NewEntry;
 }
 
-/// getEnumDeclIntegerType - returns the integer type compatible with the
-/// given enum type.
-QualType ASTContext::getEnumDeclIntegerType(const EnumDecl *ED) const {
-  if (const 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
-  }
-}
-
-
 //===----------------------------------------------------------------------===//
 //                   Type creation/memoization methods
 //===----------------------------------------------------------------------===//
index 8c6c89054fdf8bfa038b3a01013cd1f7bdfd3dec..08c46b54bd03c868bd9e4ea129afe3d1c8b20131 100644 (file)
@@ -146,7 +146,7 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) {
     if (!TD->isDefinition()) {
       ResultType = llvm::OpaqueType::get();  
     } else if (TD->getKind() == Decl::Enum) {
-      return ConvertType(Context.getEnumDeclIntegerType(cast<EnumDecl>(TD)));
+      return ConvertType(cast<EnumDecl>(TD)->getIntegerType());
     } else if (TD->getKind() == Decl::Struct) {
       const RecordDecl *RD = cast<const RecordDecl>(TD);
       std::vector<const llvm::Type*> Fields;
index 20aedec163cdf33534900d977fe69a0873679d63..6ccdf2c396a6bfb9618da36eebfa7a65af93483e 100644 (file)
@@ -1069,7 +1069,7 @@ void Sema::ParseEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX,
   
   // FIXME: Install type in Enum and constant values.
   
-  Enum->defineElements(EltList);
+  Enum->defineElements(EltList, BestType);
 }
 
 void Sema::AddTopLevelDecl(Decl *current, Decl *last) {
index b03c46144d2b0080b616704792a1786c5a40be83..782b2fcfcab9120e56f5a3a8bb1901934a01ad23 100644 (file)
@@ -147,10 +147,6 @@ public:
   /// position information.
   const RecordLayout &getRecordLayout(const RecordDecl *D, SourceLocation L);
   
-  /// getEnumDeclIntegerType - returns the integer type compatible with the
-  /// given enum type.
-  QualType getEnumDeclIntegerType(const EnumDecl *ED) const;
-  
   //===--------------------------------------------------------------------===//
   //                            Type Operators
   //===--------------------------------------------------------------------===//
index 1ffcb171de98ccff0fedb9a3f9dd02c2f2e9c36b..7c805930454685b9b74455f8e9feecd4ad34f30f 100644 (file)
@@ -412,6 +412,11 @@ class EnumDecl : public TagDecl {
   /// ElementList - this is a linked list of EnumConstantDecl's which are linked
   /// together through their getNextDeclarator pointers.
   EnumConstantDecl *ElementList;
+  
+  /// IntegerType - This represent the integer type that the enum corresponds
+  /// to for code generation purposes.  Note that the enumerator constants may
+  /// have a different type than this does.
+  QualType IntegerType;
 public:
   EnumDecl(SourceLocation L, IdentifierInfo *Id, Decl *PrevDecl)
     : TagDecl(Enum, L, Id, PrevDecl) {
@@ -421,12 +426,18 @@ public:
   /// defineElements - When created, EnumDecl correspond to a forward declared
   /// enum.  This method is used to mark the decl as being defined, with the
   /// specified list of enums.
-  void defineElements(EnumConstantDecl *ListHead) {
+  void defineElements(EnumConstantDecl *ListHead, QualType NewType) {
     assert(!isDefinition() && "Cannot redefine enums!");
     ElementList = ListHead;
     setDefinition(true);
+    
+    IntegerType = NewType;
   }
   
+  /// getIntegerType - Return the integer type this enum decl corresponds to.
+  /// This returns a null qualtype for an enum forward definition.
+  QualType getIntegerType() const { return IntegerType; }
+  
   /// getEnumConstantList - Return the first EnumConstantDecl in the enum.
   ///
   EnumConstantDecl *getEnumConstantList() { return ElementList; }
index 898c4bb5761a5739e4063e38580af9fe88562f9e..689fbfc3715dd8b7dce6994eb24f3822e6b975cb 100644 (file)
@@ -172,20 +172,6 @@ public:
     Align = WCharAlign;
   }
   
-  /// 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
-  };
-  
-  /// getEnumTypePolicy - get the target's policy for what type an enum should
-  /// be compatible with.
-  EnumTypePolicy getEnumTypePolicy(SourceLocation Loc) {
-    // FIXME: implement correctly
-    return AlwaysInt;
-  }
-  
   /// getIntMaxTWidth - Return the size of intmax_t and uintmax_t for this
   /// target, in bits.  
   unsigned getIntMaxTWidth(SourceLocation Loc) {