https://github.com/HerrCai0907 created https://github.com/llvm/llvm-project/pull/81560
Fixes: #77684. >From 35dba54b1d6d158118c34d0f1bd8038b64c9bda4 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Tue, 13 Feb 2024 09:11:06 +0800 Subject: [PATCH] [clang-tidy] fix incorrect hint for InitListExpr in prefer-member-initializer Fixes: #77684. --- .../PreferMemberInitializerCheck.cpp | 5 ++++ clang-tools-extra/docs/ReleaseNotes.rst | 3 ++- .../prefer-member-initializer.cpp | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp index de96c3dc4efef7..7ede900d7ba7b1 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp @@ -203,6 +203,7 @@ void PreferMemberInitializerCheck::check( SourceLocation InsertPos; SourceRange ReplaceRange; bool AddComma = false; + bool AddBracket = false; bool InvalidFix = false; unsigned Index = Field->getFieldIndex(); const CXXCtorInitializer *LastInListInit = nullptr; @@ -216,6 +217,7 @@ void PreferMemberInitializerCheck::check( else { ReplaceRange = Init->getInit()->getSourceRange(); } + AddBracket = isa<InitListExpr>(Init->getInit()); break; } if (Init->isMemberInitializer() && @@ -279,6 +281,9 @@ void PreferMemberInitializerCheck::check( if (HasInitAlready) { if (InsertPos.isValid()) Diag << FixItHint::CreateInsertion(InsertPos, NewInit); + else if (AddBracket) + Diag << FixItHint::CreateReplacement(ReplaceRange, + ("{" + NewInit + "}").str()); else Diag << FixItHint::CreateReplacement(ReplaceRange, NewInit); } else { diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index ee68c8f49b3df2..f8bc85d78315bf 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -127,7 +127,8 @@ Changes in existing checks <https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c48-prefer-in-class-initializers-to-member-initializers-in-constructors-for-constant-initializers>`_, which was deprecated since :program:`clang-tidy` 17. This rule is now covered by :doc:`cppcoreguidelines-use-default-member-init - <clang-tidy/checks/cppcoreguidelines/use-default-member-init>`. + <clang-tidy/checks/cppcoreguidelines/use-default-member-init>` and fixes + incorrect hints when using list-initialization. - Improved :doc:`google-build-namespaces <clang-tidy/checks/google/build-namespaces>` check by replacing the local diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/prefer-member-initializer.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/prefer-member-initializer.cpp index 8086caa2aa6f2c..63b4919608ff18 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/prefer-member-initializer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/prefer-member-initializer.cpp @@ -616,3 +616,26 @@ class Foo { #undef INVALID_HANDLE_VALUE #undef RGB } + +namespace GH77684 { +struct S1 { +// CHECK-MESSAGES: :[[@LINE+1]]:16: warning: 'M' should be initialized in a member initializer of the constructor [cppcoreguidelines-prefer-member-initializer] + S1() : M{} { M = 0; } +// CHECK-FIXES: {{ S1.+M\{0\} }} + int M; +}; +struct S2 { +// CHECK-MESSAGES: :[[@LINE+1]]:17: warning: 'M' should be initialized in a member initializer of the constructor [cppcoreguidelines-prefer-member-initializer] + S2() : M{2} { M = 1; } +// CHECK-FIXES: {{ S2.+M\{1\} }} + int M; +}; +struct T { int a; int b; int c; }; +T v; +struct S3 { +// CHECK-MESSAGES: :[[@LINE+1]]:21: warning: 'M' should be initialized in a member initializer of the constructor [cppcoreguidelines-prefer-member-initializer] + S3() : M{1,2,3} { M = v; } +// CHECK-FIXES: {{ S3.+M\{v\} }} + T M; +}; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits