Thanks for noticing this! Committed in r310587.

On Thu, Aug 10, 2017 at 2:33 PM, Haojian Wu <hok...@google.com> 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<CXXMemberCallExpr>("call");
>> -  const auto *InnerCtorCall = Result.Nodes.getNodeAs<CXXCons
>> tructExpr>("ctor");
>> +  const auto *CtorCall = Result.Nodes.getNodeAs<CXXCons
>> tructExpr>("ctor");
>>    const auto *MakeCall = Result.Nodes.getNodeAs<CallExpr>("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<std::string> ContainersWithPushBack;
>> -  std::vector<std::string> SmartPointers;
>> -  std::vector<std::string> TupleTypes;
>> -  std::vector<std::string> TupleMakeFunctions;
>> +  const bool IgnoreImplicitConstructors;
>> +  const std::vector<std::string> ContainersWithPushBack;
>> +  const std::vector<std::string> SmartPointers;
>> +  const std::vector<std::string> TupleTypes;
>> +  const std::vector<std::string> 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-tidy/modernize-use-emplac
>> e-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 <typename>
>> +class initializer_list
>> +{
>> +public:
>> +  initializer_list() noexcept {}
>> +};
>> +
>> +template <typename T>
>> +class vector {
>> +public:
>> +  vector() = default;
>> +  vector(initializer_list<T>) {}
>> +
>> +  void push_back(const T &) {}
>> +  void push_back(T &&) {}
>> +
>> +  template <typename... Args>
>> +  void emplace_back(Args &&... args){};
>> +  ~vector();
>> +};
>> +
>> +} // namespace std
>> +
>> +void testInts() {
>> +  std::vector<int> v;
>> +  v.push_back(42);
>> +  v.push_back(int(42));
>> +  v.push_back(int{42});
>> +  v.push_back(42.0);
>> +  int z;
>> +  v.push_back(z);
>> +}
>> +
>> +struct Something {
>> +  Something(int a, int b = 41) {}
>> +  Something() {}
>> +  void push_back(Something);
>> +  int getInt() { return 42; }
>> +};
>> +
>> +struct Convertable {
>> +  operator Something() { return Something{}; }
>> +};
>> +
>> +struct Zoz {
>> +  Zoz(Something, int = 42) {}
>> +};
>> +
>> +Zoz getZoz(Something s) { return Zoz(s); }
>> +
>> +void test_Something() {
>> +  std::vector<Something> v;
>> +
>> +  v.push_back(Something(1, 2));
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back instead
>> of push_back [modernize-use-emplace]
>> +  // CHECK-FIXES: v.emplace_back(1, 2);
>> +
>> +  v.push_back(Something{1, 2});
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
>> +  // CHECK-FIXES: v.emplace_back(1, 2);
>> +
>> +  v.push_back(Something());
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
>> +  // CHECK-FIXES: v.emplace_back();
>> +
>> +  v.push_back(Something{});
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
>> +  // CHECK-FIXES: v.emplace_back();
>> +
>> +  Something Different;
>> +  v.push_back(Something(Different.getInt(), 42));
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
>> +  // CHECK-FIXES: v.emplace_back(Different.getInt(), 42);
>> +
>> +  v.push_back(Different.getInt());
>> +  v.push_back(42);
>> +
>> +  Something temporary(42, 42);
>> +  temporary.push_back(temporary);
>> +  v.push_back(temporary);
>> +
>> +  v.push_back(Convertable());
>> +  v.push_back(Convertable{});
>> +  Convertable s;
>> +  v.push_back(s);
>> +}
>> +
>> +template <typename ElemType>
>> +void dependOnElem() {
>> +  std::vector<ElemType> v;
>> +  v.push_back(ElemType(42));
>> +}
>> +
>> +template <typename ContainerType>
>> +void dependOnContainer() {
>> +  ContainerType v;
>> +  v.push_back(Something(42));
>> +}
>> +
>> +void callDependent() {
>> +  dependOnElem<Something>();
>> +  dependOnContainer<std::vector<Something>>();
>> +}
>> +
>> +void test2() {
>> +  std::vector<Zoz> v;
>> +  v.push_back(Zoz(Something(21, 37)));
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
>> +  // CHECK-FIXES: v.emplace_back(Something(21, 37));
>> +
>> +  v.push_back(Zoz(Something(21, 37), 42));
>> +  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use emplace_back
>> +  // CHECK-FIXES: v.emplace_back(Something(21, 37), 42);
>> +
>> +  v.push_back(getZoz(Something(1, 2)));
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits@lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to