This revision was automatically updated to reflect the committed changes. hokein marked an inline comment as done. Closed by commit rL322822: [clang-tidy] Don't generate fix for argument constructed from std⦠(authored by hokein, committed by ). Herald added a subscriber: llvm-commits.
Repository: rL LLVM https://reviews.llvm.org/D41852 Files: clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp Index: clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp +++ clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp @@ -25,6 +25,11 @@ int a, b; }; +template<typename T> +struct MyVector { + MyVector(std::initializer_list<T>); +}; + struct Empty {}; struct E { @@ -45,6 +50,7 @@ struct H { H(std::vector<int>); + H(MyVector<int>, int); }; struct I { @@ -331,6 +337,13 @@ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead // CHECK-FIXES: PH1.reset(new H({1, 2, 3})); + std::unique_ptr<H> PH2 = std::unique_ptr<H>(new H({1, 2, 3}, 1)); + // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead + // CHECK-FIXES: std::unique_ptr<H> PH2 = std::unique_ptr<H>(new H({1, 2, 3}, 1)); + PH2.reset(new H({1, 2, 3}, 1)); + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead + // CHECK-FIXES: PH2.reset(new H({1, 2, 3}, 1)); + std::unique_ptr<I> PI1 = std::unique_ptr<I>(new I(G({1, 2, 3}))); // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead // CHECK-FIXES: std::unique_ptr<I> PI1 = std::make_unique<I>(G({1, 2, 3})); Index: clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h +++ clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h @@ -27,5 +27,6 @@ class vector { public: vector(initializer_list<_E> init); + ~vector(); }; } // namespace std Index: clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -281,12 +281,25 @@ if (isa<CXXStdInitializerListExpr>(Arg)) { return false; } + // Check whether we construct a class from a std::initializer_list. + // If so, we won't generate the fixes. + auto IsStdInitListInitConstructExpr = [](const Expr* E) { + assert(E); + if (const auto *ImplicitCE = dyn_cast<CXXConstructExpr>(E)) { + if (ImplicitCE->isStdInitListInitialization()) + return true; + } + return false; + }; // Check the implicit conversion from the std::initializer_list type to // a class type. - if (const auto *ImplicitCE = dyn_cast<CXXConstructExpr>(Arg)) { - if (ImplicitCE->isStdInitListInitialization()) { + if (IsStdInitListInitConstructExpr(Arg)) + return false; + // The Arg can be a CXXBindTemporaryExpr, checking its underlying + // construct expr. + if (const auto * CTE = dyn_cast<CXXBindTemporaryExpr>(Arg)) { + if (IsStdInitListInitConstructExpr(CTE->getSubExpr())) return false; - } } } }
Index: clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp +++ clang-tools-extra/trunk/test/clang-tidy/modernize-make-unique.cpp @@ -25,6 +25,11 @@ int a, b; }; +template<typename T> +struct MyVector { + MyVector(std::initializer_list<T>); +}; + struct Empty {}; struct E { @@ -45,6 +50,7 @@ struct H { H(std::vector<int>); + H(MyVector<int>, int); }; struct I { @@ -331,6 +337,13 @@ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead // CHECK-FIXES: PH1.reset(new H({1, 2, 3})); + std::unique_ptr<H> PH2 = std::unique_ptr<H>(new H({1, 2, 3}, 1)); + // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead + // CHECK-FIXES: std::unique_ptr<H> PH2 = std::unique_ptr<H>(new H({1, 2, 3}, 1)); + PH2.reset(new H({1, 2, 3}, 1)); + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use std::make_unique instead + // CHECK-FIXES: PH2.reset(new H({1, 2, 3}, 1)); + std::unique_ptr<I> PI1 = std::unique_ptr<I>(new I(G({1, 2, 3}))); // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead // CHECK-FIXES: std::unique_ptr<I> PI1 = std::make_unique<I>(G({1, 2, 3})); Index: clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h +++ clang-tools-extra/trunk/test/clang-tidy/Inputs/modernize-smart-ptr/initializer_list.h @@ -27,5 +27,6 @@ class vector { public: vector(initializer_list<_E> init); + ~vector(); }; } // namespace std Index: clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -281,12 +281,25 @@ if (isa<CXXStdInitializerListExpr>(Arg)) { return false; } + // Check whether we construct a class from a std::initializer_list. + // If so, we won't generate the fixes. + auto IsStdInitListInitConstructExpr = [](const Expr* E) { + assert(E); + if (const auto *ImplicitCE = dyn_cast<CXXConstructExpr>(E)) { + if (ImplicitCE->isStdInitListInitialization()) + return true; + } + return false; + }; // Check the implicit conversion from the std::initializer_list type to // a class type. - if (const auto *ImplicitCE = dyn_cast<CXXConstructExpr>(Arg)) { - if (ImplicitCE->isStdInitListInitialization()) { + if (IsStdInitListInitConstructExpr(Arg)) + return false; + // The Arg can be a CXXBindTemporaryExpr, checking its underlying + // construct expr. + if (const auto * CTE = dyn_cast<CXXBindTemporaryExpr>(Arg)) { + if (IsStdInitListInitConstructExpr(CTE->getSubExpr())) return false; - } } } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits