114 lines · cpp
1// RUN: %check_clang_tidy -std=c++14,c++17 -check-suffix=CXX-14-17 %s modernize-make-unique %t -- -- -I %S/Inputs/smart-ptr -D CXX_14_17=12// RUN: %check_clang_tidy -std=c++20 -check-suffix=CXX-20 %s modernize-make-unique %t -- -- -I %S/Inputs/smart-ptr -D CXX_20=13 4#include "unique_ptr.h"5// CHECK-FIXES: #include <memory>6 7struct NoCopyMoveCtor {8#ifdef CXX_209 // C++20 requires to see the default constructor, otherwise it is illgal.10 NoCopyMoveCtor() = default;11#endif12#ifdef CXX_14_1713 int a, b;14#endif15 NoCopyMoveCtor(const NoCopyMoveCtor &) = delete; // implies move ctor is deleted16};17 18struct NoCopyMoveCtorVisible {19#ifdef CXX_2020 NoCopyMoveCtorVisible() = default;21#endif22private:23 NoCopyMoveCtorVisible(const NoCopyMoveCtorVisible&) = default;24 NoCopyMoveCtorVisible(NoCopyMoveCtorVisible&&) = default;25};26 27struct OnlyMoveCtor {28 OnlyMoveCtor() = default;29 OnlyMoveCtor(OnlyMoveCtor&&) = default;30 OnlyMoveCtor(const OnlyMoveCtor &) = delete;31};32 33struct OnlyCopyCtor {34#ifdef CXX_2035 OnlyCopyCtor() = default;36#endif37 OnlyCopyCtor(const OnlyCopyCtor&) = default;38 OnlyCopyCtor(OnlyCopyCtor&&) = delete;39};40 41struct OnlyCopyCtorVisible {42#ifdef CXX_2043 OnlyCopyCtorVisible() = default;44#endif45 OnlyCopyCtorVisible(const OnlyCopyCtorVisible &) = default;46 47private:48 OnlyCopyCtorVisible(OnlyCopyCtorVisible &&) = default;49};50 51struct ImplicitDeletedCopyCtor {52 const OnlyMoveCtor ctor;53};54 55void f() {56 auto my_ptr = std::unique_ptr<int>(new int(1));57 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:17: warning: use std::make_unique instead58 // CHECK-FIXES-CXX-14-17: auto my_ptr = std::make_unique<int>(1);59 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:17: warning: use std::make_unique instead60 // CHECK-FIXES-CXX-20: auto my_ptr = std::make_unique<int>(1);61 62 // "new NoCopyMoveCtor{}" is processed differently in C++14/17 and C++20:63 // * In C++14/17, it is recognized as aggregate initialization,64 // no fixes will be generated although the generated fix is compilable.65 // * In C++20, it is recognized as default constructor initialization66 // (similar to "new NoCopyMoveCtor()"), the check will emit the fix and67 // the fix is correct.68 auto PNoCopyMoveCtor = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{});69 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:26: warning: use std::make_unique instead70 // CHECK-FIXES-CXX-14-17: auto PNoCopyMoveCtor = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{});71 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:26: warning: use std::make_unique instead72 // CHECK-FIXES-CXX-20: auto PNoCopyMoveCtor = std::make_unique<NoCopyMoveCtor>();73 74 auto PNoCopyMoveCtorVisible = std::unique_ptr<NoCopyMoveCtorVisible>(new NoCopyMoveCtorVisible{});75 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:33: warning: use std::make_unique instead76 // CHECK-FIXES-CXX-14-17: auto PNoCopyMoveCtorVisible = std::unique_ptr<NoCopyMoveCtorVisible>(new NoCopyMoveCtorVisible{});77 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:33: warning: use std::make_unique instead78 // CHECK-FIXES-CXX-20: auto PNoCopyMoveCtorVisible = std::make_unique<NoCopyMoveCtorVisible>();79 80 auto POnlyMoveCtor = std::unique_ptr<OnlyMoveCtor>(new OnlyMoveCtor{});81 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:24: warning: use std::make_unique instead82 // CHECK-FIXES-CXX-14-17: auto POnlyMoveCtor = std::unique_ptr<OnlyMoveCtor>(new OnlyMoveCtor{});83 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:24: warning: use std::make_unique instead84 // CHECK-FIXES-CXX-20: auto POnlyMoveCtor = std::make_unique<OnlyMoveCtor>();85 86 auto POnlyCopyCtor = std::unique_ptr<OnlyCopyCtor>(new OnlyCopyCtor{});87 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:24: warning: use std::make_unique instead88 // CHECK-FIXES-CXX-14-17: auto POnlyCopyCtor = std::unique_ptr<OnlyCopyCtor>(new OnlyCopyCtor{});89 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:24: warning: use std::make_unique instead90 // CHECK-FIXES-CXX-20: auto POnlyCopyCtor = std::make_unique<OnlyCopyCtor>();91 92 auto POnlyCopyCtorVisible = std::unique_ptr<OnlyCopyCtorVisible>(new OnlyCopyCtorVisible{});93 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:31: warning: use std::make_unique instead94 // CHECK-FIXES-CXX-14-17: auto POnlyCopyCtorVisible = std::unique_ptr<OnlyCopyCtorVisible>(new OnlyCopyCtorVisible{});95 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:31: warning: use std::make_unique instead96 // CHECK-FIXES-CXX-20: auto POnlyCopyCtorVisible = std::make_unique<OnlyCopyCtorVisible>();97 98 // This is aggregate initialization in C++20, no fix will be generated.99 auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});100 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:35: warning: use std::make_unique instead101 // CHECK-FIXES-CXX-14-17: auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});102 // CHECK-MESSAGES-CXX-20: :[[@LINE-3]]:35: warning: use std::make_unique instead103 // CHECK-FIXES-CXX-20: auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});104 105 106#ifdef CXX_14_17107 // FIXME: it is impossible to use make_unique for this case, the check should108 // stop emitting the message.109 auto PNoCopyMoveCtor2 = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{1, 2});110 // CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:27: warning: use std::make_unique instead111 // CHECK-FIXES-CXX-14-17: auto PNoCopyMoveCtor2 = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{1, 2});112#endif113}114