[clang-tools-extra] [clang-tidy] Raise minimum standard level for several checks from C++98 to C++11 (PR #152401)
Victor Chernyakin via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 8 18:08:09 PDT 2025
https://github.com/localspook updated https://github.com/llvm/llvm-project/pull/152401
>From f09e05a1aee29d94e908c3ef73d422bad65a3b34 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Wed, 6 Aug 2025 15:31:55 -0700
Subject: [PATCH 1/5] [clang-tidy] Raise minimum standard level for several
checks from C++98 to C++11
---
.../modernize/ReplaceAutoPtrCheck.h | 2 +-
.../clang-tidy/modernize/UseAutoCheck.h | 2 +-
.../modernize/UseEqualsDeleteCheck.h | 2 +-
.../clang-tidy/modernize/UseNullptrCheck.h | 4 +-
.../checkers/modernize/use-nullptr-basic.cpp | 102 +++++-------------
5 files changed, 29 insertions(+), 83 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
index 636481300d730..c91f5f580c524 100644
--- a/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
@@ -42,7 +42,7 @@ class ReplaceAutoPtrCheck : public ClangTidyCheck {
public:
ReplaceAutoPtrCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
- return LangOpts.CPlusPlus;
+ return LangOpts.CPlusPlus11;
}
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.h b/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.h
index 76c52b2d28139..7a9bbbe1cdf77 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseAutoCheck.h
@@ -17,7 +17,7 @@ class UseAutoCheck : public ClangTidyCheck {
public:
UseAutoCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
- return LangOpts.CPlusPlus;
+ return LangOpts.CPlusPlus11;
}
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h
index 64f60351c0657..dc3e712482c21 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h
@@ -23,7 +23,7 @@ class UseEqualsDeleteCheck : public ClangTidyCheck {
public:
UseEqualsDeleteCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
- return LangOpts.CPlusPlus;
+ return LangOpts.CPlusPlus11;
}
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.h b/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.h
index f1591bae44657..4c02f8ccdf303 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.h
@@ -17,9 +17,7 @@ class UseNullptrCheck : public ClangTidyCheck {
public:
UseNullptrCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
- // FIXME this should be CPlusPlus11 but that causes test cases to
- // erroneously fail.
- return LangOpts.CPlusPlus || LangOpts.C23;
+ return LangOpts.CPlusPlus11 || LangOpts.C23;
}
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
index 2579099148e3a..4f69ec5aeeb4c 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
@@ -1,9 +1,4 @@
-// RUN: %check_clang_tidy -std=c++98 %s modernize-use-nullptr %t -- -- -Wno-non-literal-null-conversion
-//
-// Some parts of the test (e.g. assignment of `const int` to `int *`) fail in
-// C++11, so we need to run the test in C++98 mode.
-//
-// FIXME: Make the test work in all language modes.
+// RUN: %check_clang_tidy %s modernize-use-nullptr %t -- -- -Wno-non-literal-null-conversion
const unsigned int g_null = 0;
#define NULL 0
@@ -23,11 +18,7 @@ void test_assignment() {
p2 = p1;
// CHECK-FIXES: p2 = p1;
- const int null = 0;
- int *p3 = null;
- // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
- // CHECK-FIXES: int *p3 = nullptr;
-
+ int *p3;
p3 = NULL;
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
// CHECK-FIXES: p3 = nullptr;
@@ -35,14 +26,11 @@ void test_assignment() {
int *p4 = p3;
// CHECK-FIXES: int *p4 = p3;
- p4 = null;
- // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
- // CHECK-FIXES: p4 = nullptr;
-
int i1 = 0;
int i2 = NULL;
+ const int null = 0;
int i3 = null;
int *p5, *p6, *p7;
@@ -70,33 +58,30 @@ int *Foo::m_p2 = NULL;
// CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use nullptr
// CHECK-FIXES: int *Foo::m_p2 = nullptr;
+// FIXME: all these DISABLED-* cases should trigger the warning.
template <typename T>
struct Bar {
Bar(T *p) : m_p(p) {
m_p = static_cast<T*>(NULL);
- // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
- // CHECK-FIXES: m_p = static_cast<T*>(nullptr);
+ // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
+ // DISABLED-CHECK-FIXES: m_p = static_cast<T*>(nullptr);
m_p = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
// CHECK-FIXES: m_p = static_cast<T*>(nullptr);
- m_p = static_cast<T*>(p ? p : static_cast<void*>(g_null));
- // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: use nullptr
- // CHECK-FIXES: m_p = static_cast<T*>(p ? p : static_cast<void*>(nullptr));
-
T *p2 = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
// CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
// CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
m_p = NULL;
- // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr
- // CHECK-FIXES: m_p = nullptr;
+ // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr
+ // DISABLED-CHECK-FIXES: m_p = nullptr;
int i = static_cast<int>(0.f);
T *i2 = static_cast<int>(0.f);
- // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
- // CHECK-FIXES: T *i2 = nullptr;
+ // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
+ // DISABLED-CHECK-FIXES: T *i2 = nullptr;
}
T *m_p;
@@ -108,9 +93,7 @@ struct Baz {
};
void test_cxx_cases() {
- Foo f(g_null);
- // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
- // CHECK-FIXES: Foo f(nullptr);
+ Foo f;
f.bar(NULL);
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
@@ -122,10 +105,6 @@ void test_cxx_cases() {
// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use nullptr
// CHECK-FIXES: f.m_p1 = nullptr;
- Bar<int> b(g_null);
- // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use nullptr
- // CHECK-FIXES: Bar<int> b(nullptr);
-
Baz b2;
int Baz::*memptr(0);
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use nullptr
@@ -144,10 +123,6 @@ void test_function_default_param2(void *p = NULL);
// CHECK-MESSAGES: :[[@LINE-1]]:45: warning: use nullptr
// CHECK-FIXES: void test_function_default_param2(void *p = nullptr);
-void test_function_default_param3(void *p = g_null);
-// CHECK-MESSAGES: :[[@LINE-1]]:45: warning: use nullptr
-// CHECK-FIXES: void test_function_default_param3(void *p = nullptr);
-
void test_function(int *p) {}
void test_function_no_ptr_param(int i) {}
@@ -161,10 +136,6 @@ void test_function_call() {
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
// CHECK-FIXES: test_function(nullptr);
- test_function(g_null);
- // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
- // CHECK-FIXES: test_function(nullptr);
-
test_function_no_ptr_param(0);
}
@@ -180,51 +151,33 @@ void *test_function_return2() {
// CHECK-FIXES: return nullptr;
}
-long *test_function_return3() {
- return g_null;
- // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
- // CHECK-FIXES: return nullptr;
-}
-
-int test_function_return4() {
+int test_function_return3() {
return 0;
}
-int test_function_return5() {
+int test_function_return4() {
return NULL;
}
-int test_function_return6() {
+int test_function_return5() {
return g_null;
}
-int *test_function_return_cast1() {
- return(int)0;
- // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
- // CHECK-FIXES: return nullptr;
-}
-
-int *test_function_return_cast2() {
+int *test_function_return_cast() {
#define RET return
- RET(int)0;
- // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use nullptr
+ RET 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use nullptr
// CHECK-FIXES: RET nullptr;
#undef RET
}
// Test parentheses expressions resulting in a nullptr.
-int *test_parentheses_expression1() {
+int *test_parentheses_expression() {
return(0);
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
// CHECK-FIXES: return(nullptr);
}
-int *test_parentheses_expression2() {
- return(int(0.f));
- // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
- // CHECK-FIXES: return(nullptr);
-}
-
int *test_nested_parentheses_expression() {
return((((0))));
// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
@@ -243,10 +196,11 @@ void *test_parentheses_explicit_cast_sequence1() {
// CHECK-FIXES: return(static_cast<void*>(nullptr));
}
+// FIXME: this case should trigger the warning.
void *test_parentheses_explicit_cast_sequence2() {
return(static_cast<void*>(reinterpret_cast<int*>((float*)int(0.f))));
- // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
- // CHECK-FIXES: return(static_cast<void*>(nullptr));
+ // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
+ // DISABLED-CHECK-FIXES: return(static_cast<void*>(nullptr));
}
// Test explicit cast expressions resulting in nullptr.
@@ -313,19 +267,13 @@ void test_const_pointers() {
const int *const_p2 = NULL;
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
// CHECK-FIXES: const int *const_p2 = nullptr;
- const int *const_p3 = (int)0;
- // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
- // CHECK-FIXES: const int *const_p3 = nullptr;
- const int *const_p4 = (int)0.0f;
- // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
- // CHECK-FIXES: const int *const_p4 = nullptr;
- const int *const_p5 = (int*)0;
+ const int *const_p3 = (int*)0;
// CHECK-MESSAGES: :[[@LINE-1]]:31: warning: use nullptr
- // CHECK-FIXES: const int *const_p5 = (int*)nullptr;
+ // CHECK-FIXES: const int *const_p3 = (int*)nullptr;
int *t;
- const int *const_p6 = static_cast<int*>(t ? t : static_cast<int*>(0));
+ const int *const_p4 = static_cast<int*>(t ? t : static_cast<int*>(0));
// CHECK-MESSAGES: :[[@LINE-1]]:69: warning: use nullptr
- // CHECK-FIXES: const int *const_p6 = static_cast<int*>(t ? t : static_cast<int*>(nullptr));
+ // CHECK-FIXES: const int *const_p4 = static_cast<int*>(t ? t : static_cast<int*>(nullptr));
}
void test_nested_implicit_cast_expr() {
>From 5aecaaa197e296901ec227ddc8540a3f94964c7e Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Wed, 6 Aug 2025 16:20:02 -0700
Subject: [PATCH 2/5] Disable some more tests
---
.../checkers/modernize/use-nullptr-basic.cpp | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
index 4f69ec5aeeb4c..9f6feb0c0f1dc 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
@@ -59,6 +59,8 @@ int *Foo::m_p2 = NULL;
// CHECK-FIXES: int *Foo::m_p2 = nullptr;
// FIXME: all these DISABLED-* cases should trigger the warning.
+// Some of them do work, but only on Linux, not on Windows.
+#if 0
template <typename T>
struct Bar {
Bar(T *p) : m_p(p) {
@@ -67,12 +69,12 @@ struct Bar {
// DISABLED-CHECK-FIXES: m_p = static_cast<T*>(nullptr);
m_p = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
- // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
- // CHECK-FIXES: m_p = static_cast<T*>(nullptr);
+ // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
+ // DISABLED-CHECK-FIXES: m_p = static_cast<T*>(nullptr);
T *p2 = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
- // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
- // CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
+ // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
+ // DISABLED-CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
m_p = NULL;
// DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr
@@ -86,6 +88,7 @@ struct Bar {
T *m_p;
};
+#endif
struct Baz {
Baz() : i(0) {}
>From f8130073fc3b1fda4c42fd8675cc8c340b3a9449 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Wed, 6 Aug 2025 19:21:41 -0700
Subject: [PATCH 3/5] Disable another test...
---
.../test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
index 9f6feb0c0f1dc..6a69c4ba4c257 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
@@ -199,12 +199,14 @@ void *test_parentheses_explicit_cast_sequence1() {
// CHECK-FIXES: return(static_cast<void*>(nullptr));
}
-// FIXME: this case should trigger the warning.
+// FIXME: this case triggers the warning on Windows but not on Linux.
+#if 0
void *test_parentheses_explicit_cast_sequence2() {
return(static_cast<void*>(reinterpret_cast<int*>((float*)int(0.f))));
// DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
// DISABLED-CHECK-FIXES: return(static_cast<void*>(nullptr));
}
+#endif
// Test explicit cast expressions resulting in nullptr.
struct Bam {
>From 8ca6d587cdeb2515b83d1f67d14955b1140b8f20 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Fri, 8 Aug 2025 16:17:47 -0700
Subject: [PATCH 4/5] Reenable tests
---
.../checkers/modernize/use-nullptr-basic.cpp | 24 +++++++++----------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
index 6a69c4ba4c257..dd061c8244f15 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
@@ -1,4 +1,7 @@
-// RUN: %check_clang_tidy %s modernize-use-nullptr %t -- -- -Wno-non-literal-null-conversion
+// RUN: %check_clang_tidy %s modernize-use-nullptr %t -- -- \
+// RUN: -target x86_64-linux-gnu -Wno-non-literal-null-conversion -fno-delayed-template-parsing
+// RUN: %check_clang_tidy %s -check-suffixes=,WINDOWS modernize-use-nullptr %t -- -- \
+// RUN: -target x86_64-windows-msvc -Wno-non-literal-null-conversion -fno-delayed-template-parsing
const unsigned int g_null = 0;
#define NULL 0
@@ -59,8 +62,6 @@ int *Foo::m_p2 = NULL;
// CHECK-FIXES: int *Foo::m_p2 = nullptr;
// FIXME: all these DISABLED-* cases should trigger the warning.
-// Some of them do work, but only on Linux, not on Windows.
-#if 0
template <typename T>
struct Bar {
Bar(T *p) : m_p(p) {
@@ -69,12 +70,12 @@ struct Bar {
// DISABLED-CHECK-FIXES: m_p = static_cast<T*>(nullptr);
m_p = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
- // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
- // DISABLED-CHECK-FIXES: m_p = static_cast<T*>(nullptr);
+ // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
+ // CHECK-FIXES: m_p = static_cast<T*>(nullptr);
T *p2 = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
- // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
- // DISABLED-CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
+ // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
+ // CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
m_p = NULL;
// DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr
@@ -88,7 +89,6 @@ struct Bar {
T *m_p;
};
-#endif
struct Baz {
Baz() : i(0) {}
@@ -199,14 +199,12 @@ void *test_parentheses_explicit_cast_sequence1() {
// CHECK-FIXES: return(static_cast<void*>(nullptr));
}
-// FIXME: this case triggers the warning on Windows but not on Linux.
-#if 0
+// FIXME: make the warning trigger on Linux too.
void *test_parentheses_explicit_cast_sequence2() {
return(static_cast<void*>(reinterpret_cast<int*>((float*)int(0.f))));
- // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
- // DISABLED-CHECK-FIXES: return(static_cast<void*>(nullptr));
+ // CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:29: warning: use nullptr
+ // CHECK-FIXES-WINDOWS: return(static_cast<void*>(nullptr));
}
-#endif
// Test explicit cast expressions resulting in nullptr.
struct Bam {
>From f8d995301d9136f515ee954c2936ceca0a0627db Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Fri, 8 Aug 2025 18:07:53 -0700
Subject: [PATCH 5/5] Do it properly this time
---
.../checkers/modernize/use-nullptr-basic.cpp | 57 +++++++------------
1 file changed, 19 insertions(+), 38 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
index dd061c8244f15..b9ffeecf2bafc 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-nullptr-basic.cpp
@@ -1,7 +1,4 @@
-// RUN: %check_clang_tidy %s modernize-use-nullptr %t -- -- \
-// RUN: -target x86_64-linux-gnu -Wno-non-literal-null-conversion -fno-delayed-template-parsing
-// RUN: %check_clang_tidy %s -check-suffixes=,WINDOWS modernize-use-nullptr %t -- -- \
-// RUN: -target x86_64-windows-msvc -Wno-non-literal-null-conversion -fno-delayed-template-parsing
+// RUN: %check_clang_tidy %s modernize-use-nullptr %t -- -- -fno-delayed-template-parsing
const unsigned int g_null = 0;
#define NULL 0
@@ -61,35 +58,6 @@ int *Foo::m_p2 = NULL;
// CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use nullptr
// CHECK-FIXES: int *Foo::m_p2 = nullptr;
-// FIXME: all these DISABLED-* cases should trigger the warning.
-template <typename T>
-struct Bar {
- Bar(T *p) : m_p(p) {
- m_p = static_cast<T*>(NULL);
- // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
- // DISABLED-CHECK-FIXES: m_p = static_cast<T*>(nullptr);
-
- m_p = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
- // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
- // CHECK-FIXES: m_p = static_cast<T*>(nullptr);
-
- T *p2 = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
- // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
- // CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
-
- m_p = NULL;
- // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr
- // DISABLED-CHECK-FIXES: m_p = nullptr;
-
- int i = static_cast<int>(0.f);
- T *i2 = static_cast<int>(0.f);
- // DISABLED-CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
- // DISABLED-CHECK-FIXES: T *i2 = nullptr;
- }
-
- T *m_p;
-};
-
struct Baz {
Baz() : i(0) {}
int i;
@@ -199,11 +167,10 @@ void *test_parentheses_explicit_cast_sequence1() {
// CHECK-FIXES: return(static_cast<void*>(nullptr));
}
-// FIXME: make the warning trigger on Linux too.
void *test_parentheses_explicit_cast_sequence2() {
- return(static_cast<void*>(reinterpret_cast<int*>((float*)int(0.f))));
- // CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:29: warning: use nullptr
- // CHECK-FIXES-WINDOWS: return(static_cast<void*>(nullptr));
+ return(static_cast<void*>(reinterpret_cast<int*>((float*)(0))));
+ // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
+ // CHECK-FIXES: return(static_cast<void*>(nullptr));
}
// Test explicit cast expressions resulting in nullptr.
@@ -299,7 +266,21 @@ void test_nested_implicit_cast_expr() {
template<typename T>
class A {
public:
- A(T *p = NULL) {}
+ A(T *p = NULL) {
+ Ptr = static_cast<T*>(NULL);
+
+ Ptr = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
+ // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
+ // CHECK-FIXES: Ptr = static_cast<T*>(nullptr);
+ // FIXME: a better fix-it is: Ptr = nullptr;
+
+ T *p2 = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
+ // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
+ // CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
+ // FIXME: a better fix-it is: T *p2 = nullptr;
+
+ Ptr = NULL;
+ }
void f() {
Ptr = NULL;
More information about the cfe-commits
mailing list