[PATCH] D41852: [clang-tidy] Don't generate fix for argument constructed from std::initializer_list.
Haojian Wu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 18 00:59:42 PST 2018
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;
- }
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41852.130366.patch
Type: text/x-patch
Size: 3206 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180118/f213878d/attachment.bin>
More information about the llvm-commits
mailing list