[clang-tidy] Fix make-unique tests on C++2a.

Summary:
These test cases are illgal in C++2a ("new Foo{}" needs to see the
default constructor), so move them to the C++14-only tests.

Reviewers: gribozavr

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D62845

llvm-svn: 362679
This commit is contained in:
Haojian Wu 2019-06-06 07:48:55 +00:00
parent 36d1f2443b
commit 448acbc06f
3 changed files with 114 additions and 70 deletions

View File

@ -1,10 +0,0 @@
// RUN: %check_clang_tidy -std=c++14-or-later %s modernize-make-unique %t -- -- -I %S/Inputs/modernize-smart-ptr
#include "unique_ptr.h"
// CHECK-FIXES: #include <memory>
void f() {
auto my_ptr = std::unique_ptr<int>(new int(1));
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use std::make_unique instead
// CHECK-FIXES: auto my_ptr = std::make_unique<int>(1);
}

View File

@ -0,0 +1,113 @@
// RUN: %check_clang_tidy -std=c++14,c++17 -check-suffix=CXX-14-17 %s modernize-make-unique %t -- -- -I %S/Inputs/modernize-smart-ptr -D CXX_14_17=1
// RUN: %check_clang_tidy -std=c++2a -check-suffix=CXX-2A %s modernize-make-unique %t -- -- -I %S/Inputs/modernize-smart-ptr -D CXX_2A=1
#include "unique_ptr.h"
// CHECK-FIXES: #include <memory>
struct NoCopyMoveCtor {
#ifdef CXX_2A
// C++2a requires to see the default constructor, otherwise it is illgal.
NoCopyMoveCtor() = default;
#endif
#ifdef CXX_14_17
int a, b;
#endif
NoCopyMoveCtor(const NoCopyMoveCtor &) = delete; // implies move ctor is deleted
};
struct NoCopyMoveCtorVisible {
#ifdef CXX_2A
NoCopyMoveCtorVisible() = default;
#endif
private:
NoCopyMoveCtorVisible(const NoCopyMoveCtorVisible&) = default;
NoCopyMoveCtorVisible(NoCopyMoveCtorVisible&&) = default;
};
struct OnlyMoveCtor {
OnlyMoveCtor() = default;
OnlyMoveCtor(OnlyMoveCtor&&) = default;
OnlyMoveCtor(const OnlyMoveCtor &) = delete;
};
struct OnlyCopyCtor {
#ifdef CXX_2A
OnlyCopyCtor() = default;
#endif
OnlyCopyCtor(const OnlyCopyCtor&) = default;
OnlyCopyCtor(OnlyCopyCtor&&) = delete;
};
struct OnlyCopyCtorVisible {
#ifdef CXX_2A
OnlyCopyCtorVisible() = default;
#endif
OnlyCopyCtorVisible(const OnlyCopyCtorVisible &) = default;
private:
OnlyCopyCtorVisible(OnlyCopyCtorVisible &&) = default;
};
struct ImplicitDeletedCopyCtor {
const OnlyMoveCtor ctor;
};
void f() {
auto my_ptr = std::unique_ptr<int>(new int(1));
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:17: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto my_ptr = std::make_unique<int>(1);
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:17: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto my_ptr = std::make_unique<int>(1);
// "new NoCopyMoveCtor{}" is processed differently in C++14/17 and C++2a:
// * In C++14/17, it is recognized as aggregate initialization,
// no fixes will be generated although the generated fix is compilable.
// * In C++2a, it is is recognized as default constructor initialization (
// similar to "new NoCopyMoveCtor()"), the check will emit the fix and the
// fix is correct.
auto PNoCopyMoveCtor = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:26: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto PNoCopyMoveCtor = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{});
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:26: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto PNoCopyMoveCtor = std::make_unique<NoCopyMoveCtor>();
auto PNoCopyMoveCtorVisible = std::unique_ptr<NoCopyMoveCtorVisible>(new NoCopyMoveCtorVisible{});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:33: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto PNoCopyMoveCtorVisible = std::unique_ptr<NoCopyMoveCtorVisible>(new NoCopyMoveCtorVisible{});
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:33: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto PNoCopyMoveCtorVisible = std::make_unique<NoCopyMoveCtorVisible>();
auto POnlyMoveCtor = std::unique_ptr<OnlyMoveCtor>(new OnlyMoveCtor{});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:24: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto POnlyMoveCtor = std::unique_ptr<OnlyMoveCtor>(new OnlyMoveCtor{});
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:24: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto POnlyMoveCtor = std::make_unique<OnlyMoveCtor>();
auto POnlyCopyCtor = std::unique_ptr<OnlyCopyCtor>(new OnlyCopyCtor{});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:24: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto POnlyCopyCtor = std::unique_ptr<OnlyCopyCtor>(new OnlyCopyCtor{});
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:24: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto POnlyCopyCtor = std::make_unique<OnlyCopyCtor>();
auto POnlyCopyCtorVisible = std::unique_ptr<OnlyCopyCtorVisible>(new OnlyCopyCtorVisible{});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:31: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto POnlyCopyCtorVisible = std::unique_ptr<OnlyCopyCtorVisible>(new OnlyCopyCtorVisible{});
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:31: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto POnlyCopyCtorVisible = std::make_unique<OnlyCopyCtorVisible>();
// This is aggregate initialization in C++2a, no fix will be generated.
auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:35: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});
// CHECK-MESSAGES-CXX-2A: :[[@LINE-3]]:35: warning: use std::make_unique instead
// CHECK-FIXES-CXX-2A: auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});
#ifdef CXX_14_17
// FIXME: it is impossible to use make_unique for this case, the check should
// stop emitting the message.
auto PNoCopyMoveCtor2 = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{1, 2});
// CHECK-MESSAGES-CXX-14-17: :[[@LINE-1]]:27: warning: use std::make_unique instead
// CHECK-FIXES-CXX-14-17: auto PNoCopyMoveCtor2 = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{1, 2});
#endif
}

View File

@ -1,5 +1,4 @@
// RUN: %check_clang_tidy -std=c++14,c++17 %s modernize-make-unique %t -- -- -I %S/Inputs/modernize-smart-ptr
// FIXME: Fix the test code in C++2a mode.
// RUN: %check_clang_tidy -std=c++14-or-later %s modernize-make-unique %t -- -- -I %S/Inputs/modernize-smart-ptr
#include "unique_ptr.h"
#include "initializer_list.h"
@ -32,37 +31,6 @@ struct MyVector {
struct Empty {};
struct NoCopyMoveCtor {
NoCopyMoveCtor(const NoCopyMoveCtor &) = delete; // implies move ctor is deleted
};
struct NoCopyMoveCtorVisible {
private:
NoCopyMoveCtorVisible(const NoCopyMoveCtorVisible&) = default;
NoCopyMoveCtorVisible(NoCopyMoveCtorVisible&&) = default;
};
struct OnlyMoveCtor {
OnlyMoveCtor() = default;
OnlyMoveCtor(OnlyMoveCtor&&) = default;
OnlyMoveCtor(const OnlyMoveCtor &) = delete;
};
struct OnlyCopyCtor {
OnlyCopyCtor(const OnlyCopyCtor&) = default;
OnlyCopyCtor(OnlyCopyCtor&&) = delete;
};
struct OnlyCopyCtorVisible {
OnlyCopyCtorVisible(const OnlyCopyCtorVisible &) = default;
private:
OnlyCopyCtorVisible(OnlyCopyCtorVisible &&) = default;
};
struct ImplicitDeletedCopyCtor {
const OnlyMoveCtor ctor;
};
struct E {
E(std::initializer_list<int>);
@ -314,33 +282,6 @@ void initialization(int T, Base b) {
// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: use std::make_unique instead
// CHECK-FIXES: std::unique_ptr<Empty> PEmpty = std::make_unique<Empty>(Empty{});
// No fixes for classes with deleted copy&move constructors.
auto PNoCopyMoveCtor = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{});
// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: use std::make_unique instead
// CHECK-FIXES: auto PNoCopyMoveCtor = std::unique_ptr<NoCopyMoveCtor>(new NoCopyMoveCtor{});
auto PNoCopyMoveCtorVisible = std::unique_ptr<NoCopyMoveCtorVisible>(new NoCopyMoveCtorVisible{});
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: use std::make_unique instead
// CHECK-FIXES: auto PNoCopyMoveCtorVisible = std::unique_ptr<NoCopyMoveCtorVisible>(new NoCopyMoveCtorVisible{});
auto POnlyMoveCtor = std::unique_ptr<OnlyMoveCtor>(new OnlyMoveCtor{});
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use std::make_unique instead
// CHECK-FIXES: auto POnlyMoveCtor = std::unique_ptr<OnlyMoveCtor>(new OnlyMoveCtor{});
// Fix for classes with classes with move constructor.
auto POnlyCopyCtor = std::unique_ptr<OnlyCopyCtor>(new OnlyCopyCtor{});
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use std::make_unique instead
// CHECK-FIXES: auto POnlyCopyCtor = std::unique_ptr<OnlyCopyCtor>(new OnlyCopyCtor{});
// Fix for classes with classes with move constructor.
auto POnlyCopyCtorVisible = std::unique_ptr<OnlyCopyCtorVisible>(new OnlyCopyCtorVisible{});
// CHECK-MESSAGES: :[[@LINE-1]]:31: warning: use std::make_unique instead
// CHECK-FIXES: auto POnlyCopyCtorVisible = std::unique_ptr<OnlyCopyCtorVisible>(new OnlyCopyCtorVisible{});
auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});
// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: use std::make_unique instead
// CHECK-FIXES: auto PImplicitDeletedCopyCtor = std::unique_ptr<ImplicitDeletedCopyCtor>(new ImplicitDeletedCopyCtor{});
// Initialization with default constructor.
std::unique_ptr<E> PE1 = std::unique_ptr<E>(new E{});
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use std::make_unique instead