diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-06-02 08:11:22 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-06-02 08:11:22 +0000 |
commit | 3fbb763a92612bb6567a7e39b50bd3e7e2f2e6a7 (patch) | |
tree | 509d726104205234a0c95fa761d5bf810032ade1 /clang/lib/Sema/SemaChecking.cpp | |
parent | 3e8c7d98beb4667ff39845277996f80eb836cd5c (diff) | |
download | bcm5719-llvm-3fbb763a92612bb6567a7e39b50bd3e7e2f2e6a7.tar.gz bcm5719-llvm-3fbb763a92612bb6567a7e39b50bd3e7e2f2e6a7.zip |
Properly consider the range of enum for range comparisons in C mode
In some cases, clang applies the C++ rules for computing the range of a
value when said value is an enum.
Instead, apply C semantics when in C mode.
llvm-svn: 183084
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index da24667804b..d1ba64e8138 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4020,20 +4020,23 @@ struct IntRange { if (const ComplexType *CT = dyn_cast<ComplexType>(T)) T = CT->getElementType().getTypePtr(); - // For enum types, use the known bit width of the enumerators. if (const EnumType *ET = dyn_cast<EnumType>(T)) { - EnumDecl *Enum = ET->getDecl(); - if (!Enum->isCompleteDefinition()) - return IntRange(C.getIntWidth(QualType(T, 0)), false); + if (C.getLangOpts().CPlusPlus) { + // For enum types, use the known bit width of the enumerators. + EnumDecl *Enum = ET->getDecl(); + if (!Enum->isCompleteDefinition()) + return IntRange(C.getIntWidth(QualType(T, 0)), false); - unsigned NumPositive = Enum->getNumPositiveBits(); - unsigned NumNegative = Enum->getNumNegativeBits(); + unsigned NumPositive = Enum->getNumPositiveBits(); + unsigned NumNegative = Enum->getNumNegativeBits(); - if (NumNegative == 0) - return IntRange(NumPositive, true/*NonNegative*/); - else - return IntRange(std::max(NumPositive + 1, NumNegative), - false/*NonNegative*/); + if (NumNegative == 0) + return IntRange(NumPositive, true/*NonNegative*/); + else + return IntRange(std::max(NumPositive + 1, NumNegative), + false/*NonNegative*/); + } else + T = C.getCanonicalType(ET->getDecl()->getIntegerType().getTypePtr()); } const BuiltinType *BT = cast<BuiltinType>(T); |