Inline diagnostic text into .td file. NFC.

llvm-svn: 368244
This commit is contained in:
Richard Trieu 2019-08-08 01:45:31 +00:00
parent b78c8a0a35
commit 07e6798baf
2 changed files with 21 additions and 10 deletions

View File

@ -8150,7 +8150,8 @@ def warn_unsupported_lifetime_extension : Warning<
// should result in a warning, since these always evaluate to a constant.
// Array comparisons have similar warnings
def warn_comparison_always : Warning<
"%select{self-|array }0comparison always evaluates to %select{a constant|%2}1">,
"%select{self-|array }0comparison always evaluates to "
"%select{a constant|true|false|'std::strong_ordering::equal'}1">,
InGroup<TautologicalCompare>;
def warn_comparison_bitwise_always : Warning<
"bitwise comparison always evaluates to %select{false|true}0">,

View File

@ -10174,45 +10174,55 @@ static void diagnoseTautologicalComparison(Sema &S, SourceLocation Loc,
// result.
ValueDecl *DL = getCompareDecl(LHSStripped);
ValueDecl *DR = getCompareDecl(RHSStripped);
// Used for indexing into %select in warn_comparison_always
enum {
AlwaysConstant,
AlwaysTrue,
AlwaysFalse,
AlwaysEqual, // std::strong_ordering::equal from operator<=>
};
if (DL && DR && declaresSameEntity(DL, DR)) {
StringRef Result;
unsigned Result;
switch (Opc) {
case BO_EQ: case BO_LE: case BO_GE:
Result = "true";
Result = AlwaysTrue;
break;
case BO_NE: case BO_LT: case BO_GT:
Result = "false";
Result = AlwaysFalse;
break;
case BO_Cmp:
Result = "'std::strong_ordering::equal'";
Result = AlwaysEqual;
break;
default:
Result = AlwaysConstant;
break;
}
S.DiagRuntimeBehavior(Loc, nullptr,
S.PDiag(diag::warn_comparison_always)
<< 0 /*self-comparison*/ << !Result.empty()
<< 0 /*self-comparison*/
<< Result);
} else if (DL && DR &&
DL->getType()->isArrayType() && DR->getType()->isArrayType() &&
!DL->isWeak() && !DR->isWeak()) {
// What is it always going to evaluate to?
StringRef Result;
unsigned Result;
switch(Opc) {
case BO_EQ: // e.g. array1 == array2
Result = "false";
Result = AlwaysFalse;
break;
case BO_NE: // e.g. array1 != array2
Result = "true";
Result = AlwaysTrue;
break;
default: // e.g. array1 <= array2
// The best we can say is 'a constant'
Result = AlwaysConstant;
break;
}
S.DiagRuntimeBehavior(Loc, nullptr,
S.PDiag(diag::warn_comparison_always)
<< 1 /*array comparison*/
<< !Result.empty() << Result);
<< Result);
}
if (isa<CastExpr>(LHSStripped))