forked from OSchip/llvm-project
Inline diagnostic text into .td file. NFC.
llvm-svn: 368244
This commit is contained in:
parent
b78c8a0a35
commit
07e6798baf
|
@ -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">,
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue