aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-tidy/bugprone/FloatLoopCounterCheck.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clang-tidy/bugprone/FloatLoopCounterCheck.cpp')
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/FloatLoopCounterCheck.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/bugprone/FloatLoopCounterCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/FloatLoopCounterCheck.cpp
new file mode 100644
index 0000000..adf2d2b
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/bugprone/FloatLoopCounterCheck.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "FloatLoopCounterCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang::tidy::bugprone {
+
+void FloatLoopCounterCheck::registerMatchers(MatchFinder *Finder) {
+ Finder->addMatcher(
+ forStmt(hasIncrement(forEachDescendant(
+ declRefExpr(hasType(realFloatingPointType()),
+ to(varDecl().bind("var")))
+ .bind("inc"))),
+ hasCondition(forEachDescendant(
+ declRefExpr(hasType(realFloatingPointType()),
+ to(varDecl(equalsBoundNode("var"))))
+ .bind("cond"))))
+ .bind("for"),
+ this);
+}
+
+void FloatLoopCounterCheck::check(const MatchFinder::MatchResult &Result) {
+ const auto *FS = Result.Nodes.getNodeAs<ForStmt>("for");
+
+ diag(FS->getInc()->getBeginLoc(), "loop induction expression should not have "
+ "floating-point type")
+ << Result.Nodes.getNodeAs<DeclRefExpr>("inc")->getSourceRange()
+ << Result.Nodes.getNodeAs<DeclRefExpr>("cond")->getSourceRange();
+
+ if (!FS->getInc()->getType()->isRealFloatingType())
+ if (const auto *V = Result.Nodes.getNodeAs<VarDecl>("var"))
+ diag(V->getBeginLoc(), "floating-point type loop induction variable",
+ DiagnosticIDs::Note);
+}
+
+} // namespace clang::tidy::bugprone