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 Hockettvoid 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 Hockettvoid 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