Files
sousa-gecko/build/clang-plugin/NaNExprChecker.cpp
T
serge-sans-paille 8d481d9b67 Bug 2030361 - Simplify logic of NaNExprChecker r=sylvestre
Using the `equalsBoundNode` makes the logic easier to follow while also
making the matcher more efficient.

Differential Revision: https://phabricator.services.mozilla.com/D293125
2026-04-16 10:40:20 +00:00

34 lines
1.2 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "NaNExprChecker.h"
#include "CustomMatchers.h"
void NaNExprChecker::registerMatchers(MatchFinder *AstMatcher) {
AstMatcher->addMatcher(
binaryOperator(
binaryEqualityOperator(),
hasLHS(
ignoringParenImpCasts(
declRefExpr(to(varDecl(hasType(qualType((isFloat())))).bind("var"))))),
hasRHS(
ignoringParenImpCasts(
declRefExpr(to(varDecl(equalsBoundNode("var")))))),
isFirstParty(),
unless(isInWhitelistForNaNExpr()))
.bind("node"),
this);
}
void NaNExprChecker::check(const MatchFinder::MatchResult &Result) {
const BinaryOperator *Expression =
Result.Nodes.getNodeAs<BinaryOperator>("node");
diag(Expression->getBeginLoc(),
"comparing a floating point value to itself for "
"NaN checking can lead to incorrect results",
DiagnosticIDs::Error);
diag(Expression->getBeginLoc(), "consider using std::isnan instead",
DiagnosticIDs::Note);
}