diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2020-07-07 11:13:47 -0400 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2020-07-07 13:29:54 -0400 |
commit | 2f71cf6d77c5cc679968851080d0513d84ddccb6 (patch) | |
tree | 7413ba9b8c6ae87f082389d604ef503717596331 /clang/lib/Sema/SemaChecking.cpp | |
parent | 7437a9496528b838e6939dbcbb69a0acb5e1332d (diff) | |
download | llvm-2f71cf6d77c5cc679968851080d0513d84ddccb6.zip llvm-2f71cf6d77c5cc679968851080d0513d84ddccb6.tar.gz llvm-2f71cf6d77c5cc679968851080d0513d84ddccb6.tar.bz2 |
[SemaObjC] Fix a -Wobjc-signed-char-bool false-positive with binary conditional operator
We were previously bypassing the conditional expression special case for binary
conditional expressions.
rdar://64134411
Differential revision: https://reviews.llvm.org/D81751
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 2b52415..77858b1 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -11936,27 +11936,31 @@ static void CheckImplicitConversion(Sema &S, Expr *E, QualType T, } } -static void CheckConditionalOperator(Sema &S, ConditionalOperator *E, +static void CheckConditionalOperator(Sema &S, AbstractConditionalOperator *E, SourceLocation CC, QualType T); static void CheckConditionalOperand(Sema &S, Expr *E, QualType T, SourceLocation CC, bool &ICContext) { E = E->IgnoreParenImpCasts(); - if (isa<ConditionalOperator>(E)) - return CheckConditionalOperator(S, cast<ConditionalOperator>(E), CC, T); + if (auto *CO = dyn_cast<AbstractConditionalOperator>(E)) + return CheckConditionalOperator(S, CO, CC, T); AnalyzeImplicitConversions(S, E, CC); if (E->getType() != T) return CheckImplicitConversion(S, E, T, CC, &ICContext); } -static void CheckConditionalOperator(Sema &S, ConditionalOperator *E, +static void CheckConditionalOperator(Sema &S, AbstractConditionalOperator *E, SourceLocation CC, QualType T) { AnalyzeImplicitConversions(S, E->getCond(), E->getQuestionLoc()); + Expr *TrueExpr = E->getTrueExpr(); + if (auto *BCO = dyn_cast<BinaryConditionalOperator>(E)) + TrueExpr = BCO->getCommon(); + bool Suspicious = false; - CheckConditionalOperand(S, E->getTrueExpr(), T, CC, Suspicious); + CheckConditionalOperand(S, TrueExpr, T, CC, Suspicious); CheckConditionalOperand(S, E->getFalseExpr(), T, CC, Suspicious); if (T->isBooleanType()) @@ -11975,7 +11979,7 @@ static void CheckConditionalOperator(Sema &S, ConditionalOperator *E, if (E->getType() == T) return; Suspicious = false; - CheckImplicitConversion(S, E->getTrueExpr()->IgnoreParenImpCasts(), + CheckImplicitConversion(S, TrueExpr->IgnoreParenImpCasts(), E->getType(), CC, &Suspicious); if (!Suspicious) CheckImplicitConversion(S, E->getFalseExpr()->IgnoreParenImpCasts(), @@ -12038,7 +12042,7 @@ static void AnalyzeImplicitConversions( // For conditional operators, we analyze the arguments as if they // were being fed directly into the output. - if (auto *CO = dyn_cast<ConditionalOperator>(SourceExpr)) { + if (auto *CO = dyn_cast<AbstractConditionalOperator>(SourceExpr)) { CheckConditionalOperator(S, CO, CC, T); return; } |