From: David Majnemer Date: Sun, 2 Jun 2013 08:11:22 +0000 (+0000) Subject: Properly consider the range of enum for range comparisons in C mode X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad69e0cc6590f2d208fa863c48697563960e4a61;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183084 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index da24667804..d1ba64e813 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -4020,20 +4020,23 @@ struct IntRange { if (const ComplexType *CT = dyn_cast(T)) T = CT->getElementType().getTypePtr(); - // For enum types, use the known bit width of the enumerators. if (const EnumType *ET = dyn_cast(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(T); diff --git a/test/Sema/outof-range-constant-compare.c b/test/Sema/outof-range-constant-compare.c index 4b1637c46c..5aa7bc8a80 100644 --- a/test/Sema/outof-range-constant-compare.c +++ b/test/Sema/outof-range-constant-compare.c @@ -147,3 +147,11 @@ int main() return 1; } + +typedef enum { + alpha=0, bravo, charlie, delta, echo +} named_t; + +static int bar(named_t foo) { + return foo > 42; +}