146bc3047SAaron Ballman //===--- VariadicfunctiondefCheck.cpp - clang-tidy-------------------------===// 246bc3047SAaron Ballman // 346bc3047SAaron Ballman // The LLVM Compiler Infrastructure 446bc3047SAaron Ballman // 546bc3047SAaron Ballman // This file is distributed under the University of Illinois Open Source 646bc3047SAaron Ballman // License. See LICENSE.TXT for details. 746bc3047SAaron Ballman // 846bc3047SAaron Ballman //===----------------------------------------------------------------------===// 946bc3047SAaron Ballman 1046bc3047SAaron Ballman #include "VariadicFunctionDefCheck.h" 1146bc3047SAaron Ballman #include "clang/AST/ASTContext.h" 1246bc3047SAaron Ballman #include "clang/ASTMatchers/ASTMatchFinder.h" 1346bc3047SAaron Ballman 1446bc3047SAaron Ballman using namespace clang::ast_matchers; 1546bc3047SAaron Ballman 1646bc3047SAaron Ballman namespace clang { 1746bc3047SAaron Ballman namespace tidy { 1846bc3047SAaron Ballman 1946bc3047SAaron Ballman void VariadicFunctionDefCheck::registerMatchers(MatchFinder *Finder) { 2046bc3047SAaron Ballman if (!getLangOpts().CPlusPlus) 2146bc3047SAaron Ballman return; 2246bc3047SAaron Ballman 23*fd3a3b3fSAaron Ballman // We only care about function *definitions* that are variadic, and do not 24*fd3a3b3fSAaron Ballman // have extern "C" language linkage. 25*fd3a3b3fSAaron Ballman Finder->addMatcher( 26*fd3a3b3fSAaron Ballman functionDecl(isDefinition(), isVariadic(), unless(isExternC())) 27*fd3a3b3fSAaron Ballman .bind("func"), 2846bc3047SAaron Ballman this); 2946bc3047SAaron Ballman } 3046bc3047SAaron Ballman 3146bc3047SAaron Ballman void VariadicFunctionDefCheck::check(const MatchFinder::MatchResult &Result) { 3246bc3047SAaron Ballman const auto *FD = Result.Nodes.getNodeAs<FunctionDecl>("func"); 3346bc3047SAaron Ballman 3446bc3047SAaron Ballman diag(FD->getLocation(), 3546bc3047SAaron Ballman "do not define a C-style variadic function; consider using a function " 3646bc3047SAaron Ballman "parameter pack or currying instead"); 3746bc3047SAaron Ballman } 3846bc3047SAaron Ballman 3946bc3047SAaron Ballman } // namespace tidy 4046bc3047SAaron Ballman } // namespace clang 4146bc3047SAaron Ballman 42