diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2013-06-07 22:07:20 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2013-06-07 22:07:20 +0000 |
| commit | 6a42665f9f0ec841aa3b98f05933e2f10207400e (patch) | |
| tree | e12a413221a87d2d628ab5d36aa1ffd396b706f7 /clang | |
| parent | 9b08a0df1c537a99f6fa093d7adbf7bcbb517d55 (diff) | |
| download | bcm5719-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.cpp | 25 | ||||
| -rw-r--r-- | clang/test/Sema/outof-range-constant-compare.c | 8 |
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; -} |

