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