-//===--- ElseAfterReturnCheck.cpp - clang-tidy-----------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "ElseAfterReturnCheck.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-#include "clang/Tooling/FixIt.h"
-
-using namespace clang::ast_matchers;
-
-namespace clang {
-namespace tidy {
-namespace readability {
-
-void ElseAfterReturnCheck::registerMatchers(MatchFinder *Finder) {
- const auto ControlFlowInterruptorMatcher =
- stmt(anyOf(returnStmt().bind("return"), continueStmt().bind("continue"),
- breakStmt().bind("break"),
- expr(ignoringImplicit(cxxThrowExpr().bind("throw")))));
- Finder->addMatcher(
- compoundStmt(forEach(
- ifStmt(hasThen(stmt(
- anyOf(ControlFlowInterruptorMatcher,
- compoundStmt(has(ControlFlowInterruptorMatcher))))),
- hasElse(stmt().bind("else")))
- .bind("if"))),
- this);
-}
-
-void ElseAfterReturnCheck::check(const MatchFinder::MatchResult &Result) {
- const auto *If = Result.Nodes.getNodeAs<IfStmt>("if");
- SourceLocation ElseLoc = If->getElseLoc();
- std::string ControlFlowInterruptor;
- for (const auto *BindingName : {"return", "continue", "break", "throw"})
- if (Result.Nodes.getNodeAs<Stmt>(BindingName))
- ControlFlowInterruptor = BindingName;
-
- DiagnosticBuilder Diag = diag(ElseLoc, "do not use 'else' after '%0'")
- << ControlFlowInterruptor;
- Diag << tooling::fixit::createRemoval(ElseLoc);
-
- // FIXME: Removing the braces isn't always safe. Do a more careful analysis.
- // FIXME: Change clang-format to correctly un-indent the code.
- if (const auto *CS = Result.Nodes.getNodeAs<CompoundStmt>("else"))
- Diag << tooling::fixit::createRemoval(CS->getLBracLoc())
- << tooling::fixit::createRemoval(CS->getRBracLoc());
-}
-
-} // namespace readability
-} // namespace tidy
-} // namespace clang
+//===--- ElseAfterReturnCheck.cpp - clang-tidy-----------------------------===//\r
+//\r
+// The LLVM Compiler Infrastructure\r
+//\r
+// This file is distributed under the University of Illinois Open Source\r
+// License. See LICENSE.TXT for details.\r
+//\r
+//===----------------------------------------------------------------------===//\r
+\r
+#include "ElseAfterReturnCheck.h"\r
+#include "clang/AST/ASTContext.h"\r
+#include "clang/ASTMatchers/ASTMatchFinder.h"\r
+#include "clang/Tooling/FixIt.h"\r
+\r
+using namespace clang::ast_matchers;\r
+\r
+namespace clang {\r
+namespace tidy {\r
+namespace readability {\r
+\r
+void ElseAfterReturnCheck::registerMatchers(MatchFinder *Finder) {\r
+ const auto ControlFlowInterruptorMatcher =\r
+ stmt(anyOf(returnStmt().bind("return"), continueStmt().bind("continue"),\r
+ breakStmt().bind("break"),\r
+ expr(ignoringImplicit(cxxThrowExpr().bind("throw")))));\r
+ Finder->addMatcher(\r
+ compoundStmt(forEach(\r
+ ifStmt(unless(isConstexpr()),\r
+ hasThen(stmt(\r
+ anyOf(ControlFlowInterruptorMatcher,\r
+ compoundStmt(has(ControlFlowInterruptorMatcher))))),\r
+ hasElse(stmt().bind("else")))\r
+ .bind("if"))),\r
+ this);\r
+}\r
+\r
+void ElseAfterReturnCheck::check(const MatchFinder::MatchResult &Result) {\r
+ const auto *If = Result.Nodes.getNodeAs<IfStmt>("if");\r
+ SourceLocation ElseLoc = If->getElseLoc();\r
+ std::string ControlFlowInterruptor;\r
+ for (const auto *BindingName : {"return", "continue", "break", "throw"})\r
+ if (Result.Nodes.getNodeAs<Stmt>(BindingName))\r
+ ControlFlowInterruptor = BindingName;\r
+\r
+ DiagnosticBuilder Diag = diag(ElseLoc, "do not use 'else' after '%0'")\r
+ << ControlFlowInterruptor;\r
+ Diag << tooling::fixit::createRemoval(ElseLoc);\r
+\r
+ // FIXME: Removing the braces isn't always safe. Do a more careful analysis.\r
+ // FIXME: Change clang-format to correctly un-indent the code.\r
+ if (const auto *CS = Result.Nodes.getNodeAs<CompoundStmt>("else"))\r
+ Diag << tooling::fixit::createRemoval(CS->getLBracLoc())\r
+ << tooling::fixit::createRemoval(CS->getRBracLoc());\r
+}\r
+\r
+} // namespace readability\r
+} // namespace tidy\r
+} // namespace clang\r