xref: /llvm-project/clang-tools-extra/clang-tidy/fuchsia/DefaultArgumentsDeclarationsCheck.cpp (revision 7d2ea6c422d3f5712b7253407005e1a465a76946)
1d9b3d08aSJulie Hockett //===--- DefaultArgumentsDeclarationsCheck.cpp - clang-tidy ---------------===//
2d9b3d08aSJulie Hockett //
3d9b3d08aSJulie Hockett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d9b3d08aSJulie Hockett // See https://llvm.org/LICENSE.txt for license information.
5d9b3d08aSJulie Hockett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d9b3d08aSJulie Hockett //
7d9b3d08aSJulie Hockett //===----------------------------------------------------------------------===//
8d9b3d08aSJulie Hockett 
9d9b3d08aSJulie Hockett #include "DefaultArgumentsDeclarationsCheck.h"
10860aefd0SNathan James #include "clang/Lex/Lexer.h"
11d9b3d08aSJulie Hockett 
12d9b3d08aSJulie Hockett using namespace clang::ast_matchers;
13d9b3d08aSJulie Hockett 
14*7d2ea6c4SCarlos Galvez namespace clang::tidy::fuchsia {
15d9b3d08aSJulie Hockett 
registerMatchers(MatchFinder * Finder)16d9b3d08aSJulie Hockett void DefaultArgumentsDeclarationsCheck::registerMatchers(MatchFinder *Finder) {
17d9b3d08aSJulie Hockett   // Declaring default parameters is disallowed.
18d9b3d08aSJulie Hockett   Finder->addMatcher(parmVarDecl(hasDefaultArgument()).bind("decl"), this);
19d9b3d08aSJulie Hockett }
20d9b3d08aSJulie Hockett 
check(const MatchFinder::MatchResult & Result)21d9b3d08aSJulie Hockett void DefaultArgumentsDeclarationsCheck::check(
22d9b3d08aSJulie Hockett     const MatchFinder::MatchResult &Result) {
23d9b3d08aSJulie Hockett   const auto *D = Result.Nodes.getNodeAs<ParmVarDecl>("decl");
24d9b3d08aSJulie Hockett   if (!D)
25d9b3d08aSJulie Hockett     return;
26d9b3d08aSJulie Hockett 
27d9b3d08aSJulie Hockett   SourceRange DefaultArgRange = D->getDefaultArgRange();
28d9b3d08aSJulie Hockett 
29d9b3d08aSJulie Hockett   if (DefaultArgRange.getEnd() != D->getEndLoc())
30d9b3d08aSJulie Hockett     return;
31d9b3d08aSJulie Hockett 
32d9b3d08aSJulie Hockett   if (DefaultArgRange.getBegin().isMacroID()) {
33d9b3d08aSJulie Hockett     diag(D->getBeginLoc(),
34d9b3d08aSJulie Hockett          "declaring a parameter with a default argument is disallowed");
35d9b3d08aSJulie Hockett     return;
36d9b3d08aSJulie Hockett   }
37d9b3d08aSJulie Hockett 
38d9b3d08aSJulie Hockett   SourceLocation StartLocation =
39d9b3d08aSJulie Hockett       D->getName().empty() ? D->getBeginLoc() : D->getLocation();
40d9b3d08aSJulie Hockett 
41d9b3d08aSJulie Hockett   SourceRange RemovalRange(
42d9b3d08aSJulie Hockett       Lexer::getLocForEndOfToken(StartLocation, 0, *Result.SourceManager,
43d9b3d08aSJulie Hockett                                  Result.Context->getLangOpts()),
44d9b3d08aSJulie Hockett       DefaultArgRange.getEnd());
45d9b3d08aSJulie Hockett 
46d9b3d08aSJulie Hockett   diag(D->getBeginLoc(),
47d9b3d08aSJulie Hockett        "declaring a parameter with a default argument is disallowed")
48d9b3d08aSJulie Hockett       << D << FixItHint::CreateRemoval(RemovalRange);
49d9b3d08aSJulie Hockett }
50d9b3d08aSJulie Hockett 
51*7d2ea6c4SCarlos Galvez } // namespace clang::tidy::fuchsia
52