summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2013-06-02 08:11:22 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2013-06-02 08:11:22 +0000
commit3fbb763a92612bb6567a7e39b50bd3e7e2f2e6a7 (patch)
tree509d726104205234a0c95fa761d5bf810032ade1 /clang/lib/Sema/SemaChecking.cpp
parent3e8c7d98beb4667ff39845277996f80eb836cd5c (diff)
downloadbcm5719-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.cpp25
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);
OpenPOWER on IntegriCloud