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..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,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 -- -- -fno-delayed-template-parsing 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,47 +58,13 @@ int *Foo::m_p2 = NULL; // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use nullptr // CHECK-FIXES: int *Foo::m_p2 = nullptr; -template -struct Bar { - Bar(T *p) : m_p(p) { - m_p = static_cast(NULL); - // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr - // CHECK-FIXES: m_p = static_cast(nullptr); - - m_p = static_cast(reinterpret_cast((void*)NULL)); - // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr - // CHECK-FIXES: m_p = static_cast(nullptr); - - m_p = static_cast(p ? p : static_cast(g_null)); - // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: use nullptr - // CHECK-FIXES: m_p = static_cast(p ? p : static_cast(nullptr)); - - T *p2 = static_cast(reinterpret_cast((void*)NULL)); - // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr - // CHECK-FIXES: T *p2 = static_cast(nullptr); - - m_p = NULL; - // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr - // CHECK-FIXES: m_p = nullptr; - - int i = static_cast(0.f); - T *i2 = static_cast(0.f); - // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr - // CHECK-FIXES: T *i2 = nullptr; - } - - T *m_p; -}; - struct Baz { Baz() : i(0) {} int i; }; 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 +76,6 @@ void test_cxx_cases() { // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use nullptr // CHECK-FIXES: f.m_p1 = nullptr; - Bar b(g_null); - // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use nullptr - // CHECK-FIXES: Bar b(nullptr); - Baz b2; int Baz::*memptr(0); // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use nullptr @@ -144,10 +94,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 +107,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 +122,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 @@ -244,7 +168,7 @@ void *test_parentheses_explicit_cast_sequence1() { } void *test_parentheses_explicit_cast_sequence2() { - return(static_cast(reinterpret_cast((float*)int(0.f)))); + return(static_cast(reinterpret_cast((float*)(0)))); // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr // CHECK-FIXES: return(static_cast(nullptr)); } @@ -313,19 +237,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(t ? t : static_cast(0)); + const int *const_p4 = static_cast(t ? t : static_cast(0)); // CHECK-MESSAGES: :[[@LINE-1]]:69: warning: use nullptr - // CHECK-FIXES: const int *const_p6 = static_cast(t ? t : static_cast(nullptr)); + // CHECK-FIXES: const int *const_p4 = static_cast(t ? t : static_cast(nullptr)); } void test_nested_implicit_cast_expr() { @@ -348,7 +266,21 @@ void test_nested_implicit_cast_expr() { template class A { public: - A(T *p = NULL) {} + A(T *p = NULL) { + Ptr = static_cast(NULL); + + Ptr = static_cast(reinterpret_cast((void*)NULL)); + // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr + // CHECK-FIXES: Ptr = static_cast(nullptr); + // FIXME: a better fix-it is: Ptr = nullptr; + + T *p2 = static_cast(reinterpret_cast((void*)NULL)); + // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr + // CHECK-FIXES: T *p2 = static_cast(nullptr); + // FIXME: a better fix-it is: T *p2 = nullptr; + + Ptr = NULL; + } void f() { Ptr = NULL;