clang-tools 23.0.0git
RedundantLambdaParameterListCheck.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "../utils/LexerUtils.h"
11
12using namespace clang::ast_matchers;
13
15
16namespace {
17
18AST_MATCHER(LambdaExpr, hasRedundantParens) {
19 return Node.hasExplicitParameters() &&
20 Node.getCallOperator()->getNumParams() == 0 &&
21 !Node.getCallOperator()->getTrailingRequiresClause();
22}
23
24} // namespace
25
27 Finder->addMatcher(lambdaExpr(hasRedundantParens()).bind("lambda"), this);
28}
29
31 const MatchFinder::MatchResult &Result) {
32 const auto *Lambda = Result.Nodes.getNodeAs<LambdaExpr>("lambda");
33
34 const LangOptions &LangOpts = getLangOpts();
35
36 const FunctionTypeLoc FTL = Lambda->getCallOperator()->getFunctionTypeLoc();
37 const SourceLocation LParenLoc = FTL.getLParenLoc();
38 const SourceLocation RParenLoc = FTL.getRParenLoc();
39
40 if (LParenLoc.isInvalid() || RParenLoc.isInvalid())
41 return;
42
43 // Ensure parens are truly empty (reject "(void)")
44 const std::optional<Token> FirstInParens =
46 LParenLoc, *Result.SourceManager, LangOpts);
47
48 if (!FirstInParens || FirstInParens->getLocation() != RParenLoc)
49 return;
50
51 const std::optional<Token> NextAfterParenTok =
53 RParenLoc, *Result.SourceManager, LangOpts);
54
55 if (!NextAfterParenTok || NextAfterParenTok->is(tok::l_square))
56 return;
57
58 if (!LangOpts.CPlusPlus23 && NextAfterParenTok->isNot(tok::l_brace))
59 return;
60
61 diag(LParenLoc, "redundant empty parameter list in lambda expression")
62 << FixItHint::CreateRemoval(LParenLoc)
63 << FixItHint::CreateRemoval(RParenLoc);
64}
65
66} // namespace clang::tidy::readability
void check(const ast_matchers::MatchFinder::MatchResult &Result) override
AST_MATCHER(BinaryOperator, isRelationalOperator)
std::optional< Token > findNextTokenSkippingComments(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
Definition LexerUtils.h:106