Re: [clang-tools-extra] r310584 - [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option
Thanks for noticing this! Committed in r310587. On Thu, Aug 10, 2017 at 2:33 PM, Haojian Wu wrote: > I think you also need to add the doc for the option in > modernize-use-emplace.rst. > > On Thu, Aug 10, 2017 at 2:19 PM, Alexander Kornienko via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: alexfh >> Date: Thu Aug 10 05:19:05 2017 >> New Revision: 310584 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=310584&view=rev >> Log: >> [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option >> >> Added: >> clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplac >> e-ignore-implicit-constructors.cpp >> Modified: >> clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp >> clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h >> >> Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck >> .cpp >> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >> clang-tidy/modernize/UseEmplaceCheck.cpp?rev=310584&r1= >> 310583&r2=310584&view=diff >> >> == >> --- clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp >> (original) >> +++ clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp Thu >> Aug 10 05:19:05 2017 >> @@ -30,6 +30,7 @@ const auto DefaultTupleMakeFunctions = " >> >> UseEmplaceCheck::UseEmplaceCheck(StringRef Name, ClangTidyContext >> *Context) >> : ClangTidyCheck(Name, Context), >> + IgnoreImplicitConstructors(Options.get("IgnoreImplicitConstructors", >> 0)), >>ContainersWithPushBack(utils::options::parseStringList(Opti >> ons.get( >>"ContainersWithPushBack", DefaultContainersWithPushBack))), >>SmartPointers(utils::options::parseStringList( >> @@ -120,9 +121,13 @@ void UseEmplaceCheck::registerMatchers(M >> >> void UseEmplaceCheck::check(const MatchFinder::MatchResult &Result) { >>const auto *Call = Result.Nodes.getNodeAs("call"); >> - const auto *InnerCtorCall = Result.Nodes.getNodeAs> tructExpr>("ctor"); >> + const auto *CtorCall = Result.Nodes.getNodeAs> tructExpr>("ctor"); >>const auto *MakeCall = Result.Nodes.getNodeAs("make"); >> - assert((InnerCtorCall || MakeCall) && "No push_back parameter >> matched"); >> + assert((CtorCall || MakeCall) && "No push_back parameter matched"); >> + >> + if (IgnoreImplicitConstructors && CtorCall && CtorCall->getNumArgs() >> >= 1 && >> + CtorCall->getArg(0)->getSourceRange() == >> CtorCall->getSourceRange()) >> +return; >> >>const auto FunctionNameSourceRange = CharSourceRange::getCharRange( >>Call->getExprLoc(), Call->getArg(0)->getExprLoc()); >> @@ -138,14 +143,14 @@ void UseEmplaceCheck::check(const MatchF >>const SourceRange CallParensRange = >>MakeCall ? SourceRange(MakeCall->getCallee()->getLocEnd(), >> MakeCall->getRParenLoc()) >> - : InnerCtorCall->getParenOrBraceRange(); >> + : CtorCall->getParenOrBraceRange(); >> >>// Finish if there is no explicit constructor call. >>if (CallParensRange.getBegin().isInvalid()) >> return; >> >>const SourceLocation ExprBegin = >> - MakeCall ? MakeCall->getExprLoc() : InnerCtorCall->getExprLoc(); >> + MakeCall ? MakeCall->getExprLoc() : CtorCall->getExprLoc(); >> >>// Range for constructor name and opening brace. >>const auto ParamCallSourceRange = >> >> Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h >> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >> clang-tidy/modernize/UseEmplaceCheck.h?rev=310584&r1=310583& >> r2=310584&view=diff >> >> == >> --- clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h >> (original) >> +++ clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h Thu >> Aug 10 05:19:05 2017 >> @@ -33,10 +33,11 @@ public: >>void storeOptions(ClangTidyOptions::OptionMap &Opts) override; >> >> private: >> - std::vector ContainersWithPushBack; >> - std::vector SmartPointers; >> - std::vector TupleTypes; >> - std::vector TupleMakeFunctions; >> + const bool IgnoreImplicitConstructors; >> + const std::vector ContainersWithPushBack; >> + const std::vector SmartPointers; >> + const std::vector TupleTypes; >> + const std::vector TupleMakeFunctions; >> }; >> >> } // namespace modernize >> >> Added: clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplac >> e-ignore-implicit-constructors.cpp >> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/ >> test/clang-tidy/modernize-use-emplace-ignore-implicit- >> constructors.cpp?rev=310584&view=auto >> >> == >> --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplac >> e-ignore-implicit-constructors.cpp (added) >> +++ clang-tools-extra/trunk/test/clang
Re: [clang-tools-extra] r310584 - [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option
I think you also need to add the doc for the option in modernize-use-emplace.rst. On Thu, Aug 10, 2017 at 2:19 PM, Alexander Kornienko via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: alexfh > Date: Thu Aug 10 05:19:05 2017 > New Revision: 310584 > > URL: http://llvm.org/viewvc/llvm-project?rev=310584&view=rev > Log: > [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option > > Added: > clang-tools-extra/trunk/test/clang-tidy/modernize-use- > emplace-ignore-implicit-constructors.cpp > Modified: > clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp > clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h > > Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp > URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/ > trunk/clang-tidy/modernize/UseEmplaceCheck.cpp?rev= > 310584&r1=310583&r2=310584&view=diff > > == > --- clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp > (original) > +++ clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp Thu > Aug 10 05:19:05 2017 > @@ -30,6 +30,7 @@ const auto DefaultTupleMakeFunctions = " > > UseEmplaceCheck::UseEmplaceCheck(StringRef Name, ClangTidyContext > *Context) > : ClangTidyCheck(Name, Context), > + IgnoreImplicitConstructors(Options.get("IgnoreImplicitConstructors", > 0)), >ContainersWithPushBack(utils::options::parseStringList(Options.get( >"ContainersWithPushBack", DefaultContainersWithPushBack))), >SmartPointers(utils::options::parseStringList( > @@ -120,9 +121,13 @@ void UseEmplaceCheck::registerMatchers(M > > void UseEmplaceCheck::check(const MatchFinder::MatchResult &Result) { >const auto *Call = Result.Nodes.getNodeAs("call"); > - const auto *InnerCtorCall = Result.Nodes.getNodeAs< > CXXConstructExpr>("ctor"); > + const auto *CtorCall = Result.Nodes.getNodeAs< > CXXConstructExpr>("ctor"); >const auto *MakeCall = Result.Nodes.getNodeAs("make"); > - assert((InnerCtorCall || MakeCall) && "No push_back parameter matched"); > + assert((CtorCall || MakeCall) && "No push_back parameter matched"); > + > + if (IgnoreImplicitConstructors && CtorCall && CtorCall->getNumArgs() >= > 1 && > + CtorCall->getArg(0)->getSourceRange() == > CtorCall->getSourceRange()) > +return; > >const auto FunctionNameSourceRange = CharSourceRange::getCharRange( >Call->getExprLoc(), Call->getArg(0)->getExprLoc()); > @@ -138,14 +143,14 @@ void UseEmplaceCheck::check(const MatchF >const SourceRange CallParensRange = >MakeCall ? SourceRange(MakeCall->getCallee()->getLocEnd(), > MakeCall->getRParenLoc()) > - : InnerCtorCall->getParenOrBraceRange(); > + : CtorCall->getParenOrBraceRange(); > >// Finish if there is no explicit constructor call. >if (CallParensRange.getBegin().isInvalid()) > return; > >const SourceLocation ExprBegin = > - MakeCall ? MakeCall->getExprLoc() : InnerCtorCall->getExprLoc(); > + MakeCall ? MakeCall->getExprLoc() : CtorCall->getExprLoc(); > >// Range for constructor name and opening brace. >const auto ParamCallSourceRange = > > Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h > URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/ > trunk/clang-tidy/modernize/UseEmplaceCheck.h?rev=310584& > r1=310583&r2=310584&view=diff > > == > --- clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h > (original) > +++ clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h Thu > Aug 10 05:19:05 2017 > @@ -33,10 +33,11 @@ public: >void storeOptions(ClangTidyOptions::OptionMap &Opts) override; > > private: > - std::vector ContainersWithPushBack; > - std::vector SmartPointers; > - std::vector TupleTypes; > - std::vector TupleMakeFunctions; > + const bool IgnoreImplicitConstructors; > + const std::vector ContainersWithPushBack; > + const std::vector SmartPointers; > + const std::vector TupleTypes; > + const std::vector TupleMakeFunctions; > }; > > } // namespace modernize > > Added: clang-tools-extra/trunk/test/clang-tidy/modernize-use- > emplace-ignore-implicit-constructors.cpp > URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/ > trunk/test/clang-tidy/modernize-use-emplace-ignore- > implicit-constructors.cpp?rev=310584&view=auto > > == > --- clang-tools-extra/trunk/test/clang-tidy/modernize-use- > emplace-ignore-implicit-constructors.cpp (added) > +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use- > emplace-ignore-implicit-constructors.cpp Thu Aug 10 05:19:05 2017 > @@ -0,0 +1,123 @@ > +// RUN: %check_clang_tidy %s modernize-use-emplace %t -- \ > +// RUN: -config="{CheckOptions: \ > +
[clang-tools-extra] r310584 - [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option
Author: alexfh Date: Thu Aug 10 05:19:05 2017 New Revision: 310584 URL: http://llvm.org/viewvc/llvm-project?rev=310584&view=rev Log: [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option Added: clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplace-ignore-implicit-constructors.cpp Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp?rev=310584&r1=310583&r2=310584&view=diff == --- clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.cpp Thu Aug 10 05:19:05 2017 @@ -30,6 +30,7 @@ const auto DefaultTupleMakeFunctions = " UseEmplaceCheck::UseEmplaceCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), + IgnoreImplicitConstructors(Options.get("IgnoreImplicitConstructors", 0)), ContainersWithPushBack(utils::options::parseStringList(Options.get( "ContainersWithPushBack", DefaultContainersWithPushBack))), SmartPointers(utils::options::parseStringList( @@ -120,9 +121,13 @@ void UseEmplaceCheck::registerMatchers(M void UseEmplaceCheck::check(const MatchFinder::MatchResult &Result) { const auto *Call = Result.Nodes.getNodeAs("call"); - const auto *InnerCtorCall = Result.Nodes.getNodeAs("ctor"); + const auto *CtorCall = Result.Nodes.getNodeAs("ctor"); const auto *MakeCall = Result.Nodes.getNodeAs("make"); - assert((InnerCtorCall || MakeCall) && "No push_back parameter matched"); + assert((CtorCall || MakeCall) && "No push_back parameter matched"); + + if (IgnoreImplicitConstructors && CtorCall && CtorCall->getNumArgs() >= 1 && + CtorCall->getArg(0)->getSourceRange() == CtorCall->getSourceRange()) +return; const auto FunctionNameSourceRange = CharSourceRange::getCharRange( Call->getExprLoc(), Call->getArg(0)->getExprLoc()); @@ -138,14 +143,14 @@ void UseEmplaceCheck::check(const MatchF const SourceRange CallParensRange = MakeCall ? SourceRange(MakeCall->getCallee()->getLocEnd(), MakeCall->getRParenLoc()) - : InnerCtorCall->getParenOrBraceRange(); + : CtorCall->getParenOrBraceRange(); // Finish if there is no explicit constructor call. if (CallParensRange.getBegin().isInvalid()) return; const SourceLocation ExprBegin = - MakeCall ? MakeCall->getExprLoc() : InnerCtorCall->getExprLoc(); + MakeCall ? MakeCall->getExprLoc() : CtorCall->getExprLoc(); // Range for constructor name and opening brace. const auto ParamCallSourceRange = Modified: clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h?rev=310584&r1=310583&r2=310584&view=diff == --- clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/modernize/UseEmplaceCheck.h Thu Aug 10 05:19:05 2017 @@ -33,10 +33,11 @@ public: void storeOptions(ClangTidyOptions::OptionMap &Opts) override; private: - std::vector ContainersWithPushBack; - std::vector SmartPointers; - std::vector TupleTypes; - std::vector TupleMakeFunctions; + const bool IgnoreImplicitConstructors; + const std::vector ContainersWithPushBack; + const std::vector SmartPointers; + const std::vector TupleTypes; + const std::vector TupleMakeFunctions; }; } // namespace modernize Added: clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplace-ignore-implicit-constructors.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplace-ignore-implicit-constructors.cpp?rev=310584&view=auto == --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplace-ignore-implicit-constructors.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-emplace-ignore-implicit-constructors.cpp Thu Aug 10 05:19:05 2017 @@ -0,0 +1,123 @@ +// RUN: %check_clang_tidy %s modernize-use-emplace %t -- \ +// RUN: -config="{CheckOptions: \ +// RUN: [{key: modernize-use-emplace.IgnoreImplicitConstructors, \ +// RUN: value: 1}] \ +// RUN: }" -- -std=c++11 + +namespace std { +template +class initializer_list +{ +public: + initializer_list() noexcept {} +}; + +template +class vector { +public: + vector() = default; + vector(initializer_list) {} + + void push_back(const T &) {} + void push_back(T &&) {} + + template + void emplac