Argiris,

I just applied this and your last patch (modulo some edits to some comments to wrap two lines at 80 cols):

http://llvm.org/viewvc/llvm-project?rev=47536&view=rev

Thanks so much!

Ted

On Feb 23, 2008, at 4:15 PM, Argiris Kirtzidis wrote:

Hi,

The attached patch, changes enum bitfields to "unsigned", to avoid getting
negative values because MSVC treats them as signed variables.
Index: include/clang/AST/Decl.h
===================================================================
--- include/clang/AST/Decl.h    (revision 47533)
+++ include/clang/AST/Decl.h    (working copy)
@@ -408,7 +408,9 @@
    : VarDecl(ParmVar, L, Id, T, S, PrevDecl),
    objcDeclQualifier(OBJC_TQ_None) {}

- ObjCDeclQualifier getObjCDeclQualifier() const { return objcDeclQualifier; }
+  ObjCDeclQualifier getObjCDeclQualifier() const {
+    return ObjCDeclQualifier(objcDeclQualifier);
+  }
  void setObjCDeclQualifier(ObjCDeclQualifier QTVal)
  { objcDeclQualifier = QTVal; }

@@ -417,9 +419,10 @@
  static bool classof(const ParmVarDecl *D) { return true; }

private:
+ // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum
  /// FIXME: Also can be paced into the bitfields in Decl.
  /// in, inout, etc.
-  ObjCDeclQualifier objcDeclQualifier : 6;
+  unsigned objcDeclQualifier : 6;

protected:
  /// EmitImpl - Serialize this ParmVarDecl. Called by Decl::Emit.
@@ -474,7 +477,7 @@
  QualType getResultType() const {
    return cast<FunctionType>(getType())->getResultType();
  }
-  StorageClass getStorageClass() const { return SClass; }
+ StorageClass getStorageClass() const { return StorageClass(SClass); }
  bool isInline() const { return IsInline; }

  // Implement isa/cast/dyncast/etc.
@@ -494,7 +497,8 @@
  /// function.
  ScopedDecl *DeclChain;

-  StorageClass SClass : 2;
+ // NOTE: VC++ treats enums as signed, avoid using the StorageClass enum
+  unsigned SClass : 2;
  bool IsInline : 1;

protected:
Index: include/clang/AST/DeclObjC.h
===================================================================
--- include/clang/AST/DeclObjC.h        (revision 47533)
+++ include/clang/AST/DeclObjC.h        (working copy)
@@ -58,11 +58,13 @@
  bool IsInstance : 1;
  bool IsVariadic : 1;

+ // NOTE: VC++ treats enums as signed, avoid using ImplementationControl enum
  /// @required/@optional
-  ImplementationControl DeclImplementation : 2;
+  unsigned DeclImplementation : 2;

+ // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum
  /// in, inout, etc.
-  ObjCDeclQualifier objcDeclQualifier : 6;
+  unsigned objcDeclQualifier : 6;

  // Context this method is declared in.
  NamedDecl *MethodContext;
@@ -104,7 +106,9 @@
    MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
  virtual ~ObjCMethodDecl();

- ObjCDeclQualifier getObjCDeclQualifier() const { return objcDeclQualifier; }
+  ObjCDeclQualifier getObjCDeclQualifier() const {
+    return ObjCDeclQualifier(objcDeclQualifier);
+  }
void setObjCDeclQualifier(ObjCDeclQualifier QV) { objcDeclQualifier = QV; }

  // Location information, modeled after the Stmt API.
@@ -149,7 +153,7 @@
    DeclImplementation = ic;
  }
  ImplementationControl getImplementationControl() const {
-    return DeclImplementation;
+    return ImplementationControl(DeclImplementation);
  }
  Stmt *const getBody() const { return Body; }
  void setBody(Stmt *B) { Body = B; }
@@ -365,13 +369,14 @@
    None, Private, Protected, Public, Package
  };
  void setAccessControl(AccessControl ac) { DeclAccess = ac; }
-  AccessControl getAccessControl() const { return DeclAccess; }
+ AccessControl getAccessControl() const { return AccessControl(DeclAccess); }

  // Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) { return D->getKind() == ObjCIvar; }
  static bool classof(const ObjCIvarDecl *D) { return true; }
private:
-  AccessControl DeclAccess : 3;
+ // NOTE: VC++ treats enums as signed, avoid using the AccessControl enum
+  unsigned DeclAccess : 3;
};


@@ -873,9 +878,10 @@
  // FIXME: Property is not an ivar.
  ObjCIvarDecl **PropertyDecls;
  int NumPropertyDecls;
+
+ // NOTE: VC++ treats enums as signed, avoid using PropertyAttributeKind enum
+  unsigned PropertyAttributes : 8;

-  PropertyAttributeKind PropertyAttributes : 8;
-
  IdentifierInfo *GetterName;    // getter name of NULL if no getter
  IdentifierInfo *SetterName;    // setter name of NULL if no setter

@@ -892,7 +898,7 @@
  void setNumPropertyDecls(int num) { NumPropertyDecls = num; }

  const PropertyAttributeKind getPropertyAttributes() const
-    { return PropertyAttributes; }
+    { return PropertyAttributeKind(PropertyAttributes); }
  void setPropertyAttributes(PropertyAttributeKind PRVal) {
    PropertyAttributes =
    (PropertyAttributeKind) (PropertyAttributes | PRVal);
Index: include/clang/AST/Type.h
===================================================================
--- include/clang/AST/Type.h    (revision 47533)
+++ include/clang/AST/Type.h    (working copy)
@@ -552,8 +552,9 @@
  /// ElementType - The element type of the array.
  QualType ElementType;

+ // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum /// NOTE: These fields are packed into the bitfields space in the Type class.
-  ArraySizeModifier SizeModifier : 2;
+  unsigned SizeModifier : 2;

  /// IndexTypeQuals - Capture qualifiers in declarations like:
  /// 'int X[static restrict 4]'. For function parameters only.
@@ -566,7 +567,9 @@
  friend class ASTContext;  // ASTContext creates these.
public:
  QualType getElementType() const { return ElementType; }
-  ArraySizeModifier getSizeModifier() const { return SizeModifier; }
+  ArraySizeModifier getSizeModifier() const {
+    return ArraySizeModifier(SizeModifier);
+  }
  unsigned getIndexTypeQualifier() const { return IndexTypeQuals; }

  QualType getBaseType() const {
Index: include/clang/Basic/IdentifierTable.h
===================================================================
--- include/clang/Basic/IdentifierTable.h       (revision 47533)
+++ include/clang/Basic/IdentifierTable.h       (working copy)
@@ -40,7 +40,8 @@
// signed char and TokenKinds > 127 won't be handled correctly. unsigned TokenID : 8; // Front-end token ID or tok::identifier. unsigned BuiltinID : 9; // ID if this is a builtin (__builtin_inf). - tok::ObjCKeywordKind ObjCID : 5; // ID for objc @ keyword like @'protocol'. + // NOTE: VC++ treats enums as signed, avoid using tok::ObjCKeywordKind enum + unsigned ObjCID : 5; // ID for objc @ keyword like @'protocol'. bool HasMacro : 1; // True if there is a #define for this. bool IsExtension : 1; // True if identifier is a lang extension.
  bool IsPoisoned             : 1; // True if identifier is poisoned.
@@ -91,7 +92,9 @@
/// getObjCKeywordID - Return the Objective-C keyword ID for the this /// identifier. For example, 'class' will return tok::objc_class if ObjC is
  /// enabled.
-  tok::ObjCKeywordKind getObjCKeywordID() const { return ObjCID; }
+  tok::ObjCKeywordKind getObjCKeywordID() const {
+    return tok::ObjCKeywordKind(ObjCID);
+  }
  void setObjCKeywordID(tok::ObjCKeywordKind ID) { ObjCID = ID; }

/// getBuiltinID - Return a value indicating whether this is a builtin
Index: include/clang/Lex/DirectoryLookup.h
===================================================================
--- include/clang/Lex/DirectoryLookup.h (revision 47533)
+++ include/clang/Lex/DirectoryLookup.h (working copy)
@@ -48,9 +48,10 @@
    const HeaderMap *Map;
  } u;

+  // NOTE: VC++ treats enums as signed, avoid using the DirType enum
/// DirCharacteristic - The type of directory this is, one of the DirType enum
  /// values.
-  DirType DirCharacteristic : 2;
+  unsigned DirCharacteristic : 2;

  /// UserSupplied - True if this is a user-supplied directory.
  ///
@@ -110,7 +111,7 @@

/// DirCharacteristic - The type of directory this is, one of the DirType enum
  /// values.
-  DirType getDirCharacteristic() const { return DirCharacteristic; }
+ DirType getDirCharacteristic() const { return DirType(DirCharacteristic); }

  /// isUserSupplied - True if this is a user-supplied directory.
  ///
Index: include/clang/Lex/HeaderSearch.h
===================================================================
--- include/clang/Lex/HeaderSearch.h    (revision 47533)
+++ include/clang/Lex/HeaderSearch.h    (working copy)
@@ -45,10 +45,11 @@
    /// isImport - True if this is a #import'd or #pragma once file.
    bool isImport : 1;

+ // NOTE: VC++ treats enums as signed, avoid using DirectoryLookup::DirType /// DirInfo - Keep track of whether this is a system header, and if so, /// whether it is C++ clean or not. This can be set by the include paths or
    /// by #pragma gcc system_header.
-    DirectoryLookup::DirType DirInfo : 2;
+    unsigned DirInfo : 2;

/// NumIncludes - This is the number of times the file has been included
    /// already.
@@ -155,7 +156,7 @@
/// getFileDirFlavor - Return whether the specified file is a normal header,
  /// a system header, or a C++ friendly system header.
  DirectoryLookup::DirType getFileDirFlavor(const FileEntry *File) {
-    return getFileInfo(File).DirInfo;
+    return DirectoryLookup::DirType(getFileInfo(File).DirInfo);
  }

/// MarkFileIncludeOnce - Mark the specified file as a "once only" file, e.g.
Index: include/clang/Parse/DeclSpec.h
===================================================================
--- include/clang/Parse/DeclSpec.h      (revision 47533)
+++ include/clang/Parse/DeclSpec.h      (working copy)
@@ -330,7 +330,7 @@
{ objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier | DQVal); }

  const ObjCPropertyAttributeKind getPropertyAttributes() const
-    { return PropertyAttributes; }
+    { return ObjCPropertyAttributeKind(PropertyAttributes); }
  void setPropertyAttributes(ObjCPropertyAttributeKind PRVal) {
    PropertyAttributes =
      (ObjCPropertyAttributeKind) (PropertyAttributes | PRVal);
@@ -349,7 +349,8 @@
  // (space saving is negligible).
  ObjCDeclQualifier objcDeclQualifier : 6;

-  ObjCPropertyAttributeKind PropertyAttributes : 8;
+ // NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttributeKind
+  unsigned PropertyAttributes : 8;
  IdentifierInfo *GetterName;    // getter name of NULL if no getter
  IdentifierInfo *SetterName;    // setter name of NULL if no setter
};
<enum-bitfields- fix.zip>_______________________________________________
cfe-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

_______________________________________________
cfe-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

Reply via email to