Prazek created this revision. Prazek added reviewers: alexfh, aaron.ballman, hokein. Prazek added a subscriber: cfe-commits.
Bugfix for 27321. When the constructor of stored pointer type is private then it is invalid to change it to make_shared or make_unique. https://reviews.llvm.org/D23343 Files: clang-tidy/modernize/MakeSmartPtrCheck.cpp test/clang-tidy/modernize-make-shared.cpp test/clang-tidy/modernize-make-unique.cpp Index: test/clang-tidy/modernize-make-unique.cpp =================================================================== --- test/clang-tidy/modernize-make-unique.cpp +++ test/clang-tidy/modernize-make-unique.cpp @@ -103,6 +103,17 @@ std::unique_ptr<int> Placement = std::unique_ptr<int>(new (PInt) int{3}); } +class Private { +private: + Private(int z) {} + +public: + void create() { + auto ptr = std::unique_ptr<Private>(new Private(42)); + } +}; + + void initialization(int T, Base b) { // Test different kinds of initialization of the pointee. Index: test/clang-tidy/modernize-make-shared.cpp =================================================================== --- test/clang-tidy/modernize-make-shared.cpp +++ test/clang-tidy/modernize-make-shared.cpp @@ -100,6 +100,18 @@ std::shared_ptr<int> Placement = std::shared_ptr<int>(new (PInt) int{3}); } +class Private { +private: + Private(int z) {} + +public: + void create() { + auto ptr = std::shared_ptr<Private>(new Private(42)); + } + + ~Private(); +}; + void initialization(int T, Base b) { // Test different kinds of initialization of the pointee. Index: clang-tidy/modernize/MakeSmartPtrCheck.cpp =================================================================== --- clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -29,13 +29,19 @@ if (!getLangOpts().CPlusPlus11) return; + // It is possible to make smart ptr calling private ctor inside of a member + // function. Change to make_smart_ptr will be invalid. + auto CallsPrivateCtor = has(ignoringImpCasts(cxxConstructExpr( + hasDeclaration(decl(isPrivate()))))); + Finder->addMatcher( cxxBindTemporaryExpr(has(ignoringParenImpCasts( cxxConstructExpr( hasType(getSmartPointerTypeMatcher()), argumentCountIs(1), hasArgument(0, cxxNewExpr(hasType(pointsTo(qualType(hasCanonicalType( - equalsBoundNode(PointerType)))))) + equalsBoundNode(PointerType))))), + unless(CallsPrivateCtor)) .bind(NewExpression))) .bind(ConstructorCall)))), this);
Index: test/clang-tidy/modernize-make-unique.cpp =================================================================== --- test/clang-tidy/modernize-make-unique.cpp +++ test/clang-tidy/modernize-make-unique.cpp @@ -103,6 +103,17 @@ std::unique_ptr<int> Placement = std::unique_ptr<int>(new (PInt) int{3}); } +class Private { +private: + Private(int z) {} + +public: + void create() { + auto ptr = std::unique_ptr<Private>(new Private(42)); + } +}; + + void initialization(int T, Base b) { // Test different kinds of initialization of the pointee. Index: test/clang-tidy/modernize-make-shared.cpp =================================================================== --- test/clang-tidy/modernize-make-shared.cpp +++ test/clang-tidy/modernize-make-shared.cpp @@ -100,6 +100,18 @@ std::shared_ptr<int> Placement = std::shared_ptr<int>(new (PInt) int{3}); } +class Private { +private: + Private(int z) {} + +public: + void create() { + auto ptr = std::shared_ptr<Private>(new Private(42)); + } + + ~Private(); +}; + void initialization(int T, Base b) { // Test different kinds of initialization of the pointee. Index: clang-tidy/modernize/MakeSmartPtrCheck.cpp =================================================================== --- clang-tidy/modernize/MakeSmartPtrCheck.cpp +++ clang-tidy/modernize/MakeSmartPtrCheck.cpp @@ -29,13 +29,19 @@ if (!getLangOpts().CPlusPlus11) return; + // It is possible to make smart ptr calling private ctor inside of a member + // function. Change to make_smart_ptr will be invalid. + auto CallsPrivateCtor = has(ignoringImpCasts(cxxConstructExpr( + hasDeclaration(decl(isPrivate()))))); + Finder->addMatcher( cxxBindTemporaryExpr(has(ignoringParenImpCasts( cxxConstructExpr( hasType(getSmartPointerTypeMatcher()), argumentCountIs(1), hasArgument(0, cxxNewExpr(hasType(pointsTo(qualType(hasCanonicalType( - equalsBoundNode(PointerType)))))) + equalsBoundNode(PointerType))))), + unless(CallsPrivateCtor)) .bind(NewExpression))) .bind(ConstructorCall)))), this);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits