Re: [clang-tools-extra] r310584 - [clang-tidy] Add modernize-use-emplace.IgnoreImplicitConstructors option

2017-08-10 Thread Alexander Kornienko via cfe-commits
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

2017-08-10 Thread Haojian Wu via cfe-commits
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

2017-08-10 Thread Alexander Kornienko via cfe-commits
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