[PATCH] D22871: Fix incorrect -Wtautological-constant-out-of-range warnings with enums
Ismail Badawi via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 27 09:42:19 PDT 2016
ibadawi created this revision.
ibadawi added reviewers: majnemer, rjmccall.
ibadawi added a subscriber: cfe-commits.
This is a proposed fix for bug 16154 (https://llvm.org/bugs/show_bug.cgi?id=16154) -- it was tentatively fixed in r183084 but had the fix was backed out in r183575 because the approach taken wrongly affected the behavior or other warnings.
https://reviews.llvm.org/D22871
Files:
lib/Sema/SemaChecking.cpp
test/Sema/outof-range-constant-compare.c
Index: test/Sema/outof-range-constant-compare.c
===================================================================
--- test/Sema/outof-range-constant-compare.c
+++ test/Sema/outof-range-constant-compare.c
@@ -147,3 +147,15 @@
return 1;
}
+
+typedef enum {
+ alpha = 0,
+ bravo,
+ charlie,
+ delta,
+ echo
+} named_t;
+
+static int bar(named_t foo) {
+ return foo > 42;
+}
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -7075,6 +7075,12 @@
return IntRange(C.getIntWidth(QualType(T, 0)), BT->isUnsignedInteger());
}
+ /// Returns the "target" range of a given integral type.
+ static IntRange forTargetOfType(ASTContext &C, QualType T) {
+ return forTargetOfCanonicalType(C,
+ T->getCanonicalTypeInternal().getTypePtr());
+ }
+
/// Returns the "target" range of a canonical integral type, i.e.
/// the range of values expressible in the type.
///
@@ -7492,7 +7498,10 @@
QualType OtherT = Other->getType();
if (const auto *AT = OtherT->getAs<AtomicType>())
OtherT = AT->getValueType();
- IntRange OtherRange = IntRange::forValueOfType(S.Context, OtherT);
+ IntRange OtherRange = S.getLangOpts().CPlusPlus
+ ? IntRange::forValueOfType(S.Context, OtherT)
+ : IntRange::forTargetOfType(S.Context, OtherT);
+
unsigned OtherWidth = OtherRange.Width;
bool OtherIsBooleanType = Other->isKnownToHaveBooleanValue();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22871.65757.patch
Type: text/x-patch
Size: 1571 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160727/0a29d70e/attachment.bin>
More information about the cfe-commits
mailing list