brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 55af2d1 Raw
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