mirror of https://github.com/microsoft/clang.git
[PR36008] Avoid -Wsign-compare warning for enum constants in
typeof expressions This commit looks through typeof type at the original expression when diagnosing -Wsign-compare to avoid an unfriendly diagnostic. rdar://36588828 Differential Revision: https://reviews.llvm.org/D42561 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@324514 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b887aacccd
commit
7f5ae1507e
|
@ -8955,6 +8955,16 @@ static void AnalyzeComparison(Sema &S, BinaryOperator *E) {
|
||||||
LHS = LHS->IgnoreParenImpCasts();
|
LHS = LHS->IgnoreParenImpCasts();
|
||||||
RHS = RHS->IgnoreParenImpCasts();
|
RHS = RHS->IgnoreParenImpCasts();
|
||||||
|
|
||||||
|
if (!S.getLangOpts().CPlusPlus) {
|
||||||
|
// Avoid warning about comparison of integers with different signs when
|
||||||
|
// RHS/LHS has a `typeof(E)` type whose sign is different from the sign of
|
||||||
|
// the type of `E`.
|
||||||
|
if (const auto *TET = dyn_cast<TypeOfExprType>(LHS->getType()))
|
||||||
|
LHS = TET->getUnderlyingExpr()->IgnoreParenImpCasts();
|
||||||
|
if (const auto *TET = dyn_cast<TypeOfExprType>(RHS->getType()))
|
||||||
|
RHS = TET->getUnderlyingExpr()->IgnoreParenImpCasts();
|
||||||
|
}
|
||||||
|
|
||||||
// Check to see if one of the (unmodified) operands is of different
|
// Check to see if one of the (unmodified) operands is of different
|
||||||
// signedness.
|
// signedness.
|
||||||
Expr *signedOperand, *unsignedOperand;
|
Expr *signedOperand, *unsignedOperand;
|
||||||
|
|
|
@ -391,3 +391,16 @@ typedef char two_chars[2];
|
||||||
void test12(unsigned a) {
|
void test12(unsigned a) {
|
||||||
if (0 && -1 > a) { }
|
if (0 && -1 > a) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PR36008
|
||||||
|
|
||||||
|
enum PR36008EnumTest {
|
||||||
|
kPR36008Value = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
void pr36008(enum PR36008EnumTest lhs) {
|
||||||
|
__typeof__(lhs) x = lhs;
|
||||||
|
__typeof__(kPR36008Value) y = (kPR36008Value);
|
||||||
|
if (x == y) x = y; // no warning
|
||||||
|
if (y == x) y = x; // no warning
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue