diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -13804,6 +13804,13 @@ if (InRange && IsEnumConstOrFromMacro(S, Constant)) return false; + // Don't warn if the comparison involves the 'size_t' type. + QualType SizeT = S.Context.getSizeType(); + if (S.Context.hasSameType(Constant->getType().getCanonicalType(), SizeT) && + S.Context.hasSameType(Other->getType().getCanonicalType(), SizeT)) { + return false; + } + // A comparison of an unsigned bit-field against 0 is really a type problem, // even though at the type level the bit-field might promote to 'signed int'. if (Other->refersToBitField() && InRange && Value == 0 && diff --git a/clang/test/Sema/type-limit-compare.cpp b/clang/test/Sema/type-limit-compare.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Sema/type-limit-compare.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 %s -fsyntax-only -Wtautological-type-limit-compare -verify + +// expected-no-diagnostics + +typedef unsigned long uint64_t; +namespace std { +using size_t = decltype(sizeof(0)); +} // namespace std + +bool func(uint64_t Size) { + if (sizeof(std::size_t) < sizeof(uint64_t) && + Size > (uint64_t)(__SIZE_MAX__)) + return false; + return true; +} +