summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2013-06-07 22:07:20 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2013-06-07 22:07:20 +0000
commit6a42665f9f0ec841aa3b98f05933e2f10207400e (patch)
treee12a413221a87d2d628ab5d36aa1ffd396b706f7 /clang
parent9b08a0df1c537a99f6fa093d7adbf7bcbb517d55 (diff)
downloadbcm5719-llvm-6a42665f9f0ec841aa3b98f05933e2f10207400e.tar.gz
bcm5719-llvm-6a42665f9f0ec841aa3b98f05933e2f10207400e.zip
Revert "Properly consider the range of enum for range comparisons in C mode"
The approach r183084 took was wrong, back it out. llvm-svn: 183575
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp25
-rw-r--r--clang/test/Sema/outof-range-constant-compare.c8
2 files changed, 11 insertions, 22 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index d1ba64e8138..da24667804b 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -4020,23 +4020,20 @@ 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)) {
- 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);
+ 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*/);
- } else
- T = C.getCanonicalType(ET->getDecl()->getIntegerType().getTypePtr());
+ if (NumNegative == 0)
+ return IntRange(NumPositive, true/*NonNegative*/);
+ else
+ return IntRange(std::max(NumPositive + 1, NumNegative),
+ false/*NonNegative*/);
}
const BuiltinType *BT = cast<BuiltinType>(T);
diff --git a/clang/test/Sema/outof-range-constant-compare.c b/clang/test/Sema/outof-range-constant-compare.c
index 5aa7bc8a80e..4b1637c46c5 100644
--- a/clang/test/Sema/outof-range-constant-compare.c
+++ b/clang/test/Sema/outof-range-constant-compare.c
@@ -147,11 +147,3 @@ int main()
return 1;
}
-
-typedef enum {
- alpha=0, bravo, charlie, delta, echo
-} named_t;
-
-static int bar(named_t foo) {
- return foo > 42;
-}
OpenPOWER on IntegriCloud