[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
whiteio wrote: I'll update my changes to fix the other tests that are failing this evening, sorry about that, should have ran the rest of them after making the change. https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio created https://github.com/llvm/llvm-project/pull/116871 Fix -Wunused-private-field incorrectly suppressing warnings for friend defaulted comparison operators. The warning should only be suppressed when the defaulted comparison is a class member function. Fixes #116270 >From c69426607d63b3a0cf7d839c82cde55273a5f942 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 19 Nov 2024 20:06:28 + Subject: [PATCH] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators Fix -Wunused-private-field suppressing warnings when defaulted comparison operators are declared as friend functions. The warning should only be suppressed for comparison operators that are class members. Fixes #116270 --- clang/lib/Sema/SemaDeclCXX.cpp | 2 +- clang/test/SemaCXX/warn-unused-private-field.cpp | 11 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 26041e53de5061..e115eb0a3d7e10 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); if (DefKind.isSpecialMember() diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index 1128eacc309d9f..bdd66807dca35f 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,6 +20,17 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; +}; + #endif class NotFullyDefined { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
@@ -20,6 +20,17 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; whiteio wrote: I've updated the tests, hopefully I didn't misinterpret your comments. I added a non-friend method to the unrelated class and added a case where the comparison is defined as a friend function. https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/116871 >From c69426607d63b3a0cf7d839c82cde55273a5f942 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 19 Nov 2024 20:06:28 + Subject: [PATCH 1/2] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators Fix -Wunused-private-field suppressing warnings when defaulted comparison operators are declared as friend functions. The warning should only be suppressed for comparison operators that are class members. Fixes #116270 --- clang/lib/Sema/SemaDeclCXX.cpp | 2 +- clang/test/SemaCXX/warn-unused-private-field.cpp | 11 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 26041e53de5061..e115eb0a3d7e10 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); if (DefKind.isSpecialMember() diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index 1128eacc309d9f..bdd66807dca35f 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,6 +20,17 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; +}; + #endif class NotFullyDefined { >From 1f64a2bb972f5cf9e6455eb721acfd8281ad6981 Mon Sep 17 00:00:00 2001 From: Chris White Date: Wed, 20 Nov 2024 18:34:52 + Subject: [PATCH 2/2] Address review comments --- clang/lib/Sema/SemaDeclCXX.cpp | 9 +++-- clang/test/SemaCXX/warn-unused-private-field.cpp | 13 - 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e115eb0a3d7e10..0123051a305611 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,8 +7535,13 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison() && isa(FD->getDeclContext())) -UnusedPrivateFields.clear(); + if (DefKind.isComparison()) { +auto PT = FD->getParamDecl(0)->getType(); +CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl(); +for (FieldDecl *Field : RD->fields()) { + UnusedPrivateFields.remove(Field); +} + } if (DefKind.isSpecialMember() ? CheckExplicitlyDefaultedSpecialMember(cast(FD), diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index bdd66807dca35f..717b1864272140 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,17 +20,20 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; -class UnusedConstPrivateField { - public: - UnusedConstPrivateField() : unused_(0) {} - private: - const int unused_; // expected-warning{{private field 'unused_' is not used}} +class HasUnusedField { + int unused_; // expected-warning{{private field 'unused_' is not used}} }; class FriendEqDefaultCompare { + int used; friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; }; +class UnrelatedFriendEqDefaultCompare { + friend auto operator==(UnrelatedFriendEqDefaultCompare, UnrelatedFriendEqDefaultCompare) -> bool = default; + int operator<=>(const UnrelatedFriendEqDefaultCompare &) const = default; +}; + #endif class NotFullyDefined { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
@@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); whiteio wrote: Thanks for the pointers! I believe I understand now. I've push a new commit with the changes 1f64a2bb972f5cf9e6455eb721acfd8281ad6981 https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
whiteio wrote: @Maetveis I've disabled that settings now. Thanks! https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
whiteio wrote: @Maetveis Thanks for letting me know, I'll resolve the conflicts and let you know once they're resolved. https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/116871 >From 29330456191334afb6cd82ae44f496c522985877 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 19 Nov 2024 20:06:28 + Subject: [PATCH 1/3] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators Fix -Wunused-private-field suppressing warnings when defaulted comparison operators are declared as friend functions. The warning should only be suppressed for comparison operators that are class members. Fixes #116270 --- clang/lib/Sema/SemaDeclCXX.cpp | 2 +- clang/test/SemaCXX/warn-unused-private-field.cpp | 11 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 7e8e321c4b90e6..7434a29191cdb5 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); if (DefKind.isSpecialMember() diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index bf104b1a76a656..4448d4715faad0 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -40,6 +40,17 @@ class FriendEqDefaultCompareOutOfClass { bool operator==(const FriendEqDefaultCompareOutOfClass &, const FriendEqDefaultCompareOutOfClass &) = default; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; +}; + #endif class NotFullyDefined { >From a7885a848d7a439659af33d69a13b245c725c690 Mon Sep 17 00:00:00 2001 From: Chris White Date: Wed, 20 Nov 2024 18:34:52 + Subject: [PATCH 2/3] Address review comments --- clang/lib/Sema/SemaDeclCXX.cpp | 11 +-- .../test/SemaCXX/warn-unused-private-field.cpp | 18 ++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 7434a29191cdb5..f7a0b3c059ec91 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,8 +7535,15 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison() && isa(FD->getDeclContext())) -UnusedPrivateFields.clear(); + if (DefKind.isComparison()) { +auto PT = FD->getParamDecl(0)->getType(); +if (const CXXRecordDecl *RD = +PT.getNonReferenceType()->getAsCXXRecordDecl()) { + for (FieldDecl *Field : RD->fields()) { +UnusedPrivateFields.remove(Field); + } +} + } if (DefKind.isSpecialMember() ? CheckExplicitlyDefaultedSpecialMember(cast(FD), diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index 4448d4715faad0..9eccfc20430439 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -41,16 +41,26 @@ class FriendEqDefaultCompareOutOfClass { bool operator==(const FriendEqDefaultCompareOutOfClass &, const FriendEqDefaultCompareOutOfClass &) = default; class UnusedConstPrivateField { - public: - UnusedConstPrivateField() : unused_(0) {} - private: - const int unused_; // expected-warning{{private field 'unused_' is not used}} +public: +UnusedConstPrivateField() : unused_(0) {} +private: +const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class HasUnusedField { + int unused_; // expected-warning{{private field 'unused_' is not used}} }; class FriendEqDefaultCompare { + int used; friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; }; +class UnrelatedFriendEqDefaultCompare { + friend auto operator==(UnrelatedFriendEqDefaultCompare, UnrelatedFriendEqDefaultCompare) -> bool = default; + int operator<=>(const UnrelatedFriendEqDefaultCompare &) const = default; +}; + #endif class NotFullyDefined { >From 825f92f653d9961f7673e5f83bdea7ea12e97860 Mon Sep 17 00:00:00 2001 From: Chris White Date: Sat, 23 Nov 2024 14:55:47 + Subject: [PATCH 3/3] Update release notes --- clang/docs/ReleaseNotes.rst | 14 ++ 1 file changed, 14 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 191b4cc0ce07ad..30fbdc9769c958 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -641,6 +641,20 @@ Improvements to Clang's diagnostics - Clang now diagnoses dangling refere
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/116871 >From 29330456191334afb6cd82ae44f496c522985877 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 19 Nov 2024 20:06:28 + Subject: [PATCH 1/3] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators Fix -Wunused-private-field suppressing warnings when defaulted comparison operators are declared as friend functions. The warning should only be suppressed for comparison operators that are class members. Fixes #116270 --- clang/lib/Sema/SemaDeclCXX.cpp | 2 +- clang/test/SemaCXX/warn-unused-private-field.cpp | 11 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 7e8e321c4b90e6..7434a29191cdb5 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); if (DefKind.isSpecialMember() diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index bf104b1a76a656..4448d4715faad0 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -40,6 +40,17 @@ class FriendEqDefaultCompareOutOfClass { bool operator==(const FriendEqDefaultCompareOutOfClass &, const FriendEqDefaultCompareOutOfClass &) = default; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; +}; + #endif class NotFullyDefined { >From a7885a848d7a439659af33d69a13b245c725c690 Mon Sep 17 00:00:00 2001 From: Chris White Date: Wed, 20 Nov 2024 18:34:52 + Subject: [PATCH 2/3] Address review comments --- clang/lib/Sema/SemaDeclCXX.cpp | 11 +-- .../test/SemaCXX/warn-unused-private-field.cpp | 18 ++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 7434a29191cdb5..f7a0b3c059ec91 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,8 +7535,15 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison() && isa(FD->getDeclContext())) -UnusedPrivateFields.clear(); + if (DefKind.isComparison()) { +auto PT = FD->getParamDecl(0)->getType(); +if (const CXXRecordDecl *RD = +PT.getNonReferenceType()->getAsCXXRecordDecl()) { + for (FieldDecl *Field : RD->fields()) { +UnusedPrivateFields.remove(Field); + } +} + } if (DefKind.isSpecialMember() ? CheckExplicitlyDefaultedSpecialMember(cast(FD), diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index 4448d4715faad0..9eccfc20430439 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -41,16 +41,26 @@ class FriendEqDefaultCompareOutOfClass { bool operator==(const FriendEqDefaultCompareOutOfClass &, const FriendEqDefaultCompareOutOfClass &) = default; class UnusedConstPrivateField { - public: - UnusedConstPrivateField() : unused_(0) {} - private: - const int unused_; // expected-warning{{private field 'unused_' is not used}} +public: +UnusedConstPrivateField() : unused_(0) {} +private: +const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class HasUnusedField { + int unused_; // expected-warning{{private field 'unused_' is not used}} }; class FriendEqDefaultCompare { + int used; friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; }; +class UnrelatedFriendEqDefaultCompare { + friend auto operator==(UnrelatedFriendEqDefaultCompare, UnrelatedFriendEqDefaultCompare) -> bool = default; + int operator<=>(const UnrelatedFriendEqDefaultCompare &) const = default; +}; + #endif class NotFullyDefined { >From d95b9d995a19c10d394474fd67cde4d834476cad Mon Sep 17 00:00:00 2001 From: Chris White Date: Sat, 23 Nov 2024 14:55:47 + Subject: [PATCH 3/3] Update release notes --- clang/docs/ReleaseNotes.rst | 14 ++ clang/test/SemaCXX/warn-unused-private-field.cpp | 7 --- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 191b4cc0ce07ad..30fbdc9769c958 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
whiteio wrote: Hey @Maetveis, I've addressed the conflicts 👍 https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc (PR #120644)
https://github.com/whiteio created https://github.com/llvm/llvm-project/pull/120644 Exposing `-fdiagnostic-color=` to clang-cl and clang-dxc. `-fcolor-diagnostics` and `-fno-color-diagnostics` are already allowed in both of these and `-fdiagnostics-color=` allows one additional value, `auto`. I've added the tests for clang-cl to `cl-options.c` as per the comments in the issue linked below. I couldn't finding a suitable existing file to add the clang-dxc tests to so I've created a new one. Resolves #119184 >From 1f52639c56681b061a92998681da727800dbf95d Mon Sep 17 00:00:00 2001 From: Chris White Date: Thu, 19 Dec 2024 22:02:47 + Subject: [PATCH] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc --- clang/include/clang/Driver/Options.td | 2 +- clang/test/Driver/cl-options.c| 9 + clang/test/Driver/dxc_options.hlsl| 8 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 clang/test/Driver/dxc_options.hlsl diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 638f8c52053ec5..ad64626d960d43 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1990,7 +1990,7 @@ def : Flag<["-"], "fno-diagnostics-color">, Group, Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Alias; def fdiagnostics_color_EQ : Joined<["-"], "fdiagnostics-color=">, Group, - Visibility<[ClangOption, FlangOption]>, + Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Values<"auto,always,never">, HelpText<"When to use colors in diagnostics">; def fansi_escape_codes : Flag<["-"], "fansi-escape-codes">, Group, diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 477e8489e74280..fe57a5232b2fdc 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -664,6 +664,15 @@ // RUN: not %clang_cl /guard:foo -### -- %s 2>&1 | FileCheck -check-prefix=CFGUARDINVALID %s // CFGUARDINVALID: invalid value 'foo' in '/guard:' +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_cl -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_cl -fdiagnostics-color -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=always -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=never -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" + // Accept "core" clang options. // (/Zs is for syntax-only, -Werror makes it fail hard on unknown options) // RUN: %clang_cl \ diff --git a/clang/test/Driver/dxc_options.hlsl b/clang/test/Driver/dxc_options.hlsl new file mode 100644 index 00..9bd4b61cdcf19d --- /dev/null +++ b/clang/test/Driver/dxc_options.hlsl @@ -0,0 +1,8 @@ +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=always -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=never -### %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" \ No newline at end of file ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc (PR #120644)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/120644 >From 770dec5aec1b879bafbc6c69b12a2e43c9497f7f Mon Sep 17 00:00:00 2001 From: Chris White Date: Thu, 19 Dec 2024 22:02:47 + Subject: [PATCH] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc --- clang/include/clang/Driver/Options.td | 2 +- clang/test/Driver/cl-options.c | 9 + clang/test/Driver/dxc_options.hlsl | 8 clang/test/Driver/unknown-arg-drivermodes.test | 4 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 clang/test/Driver/dxc_options.hlsl diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 638f8c52053ec5..ad64626d960d43 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1990,7 +1990,7 @@ def : Flag<["-"], "fno-diagnostics-color">, Group, Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Alias; def fdiagnostics_color_EQ : Joined<["-"], "fdiagnostics-color=">, Group, - Visibility<[ClangOption, FlangOption]>, + Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Values<"auto,always,never">, HelpText<"When to use colors in diagnostics">; def fansi_escape_codes : Flag<["-"], "fansi-escape-codes">, Group, diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 477e8489e74280..fe57a5232b2fdc 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -664,6 +664,15 @@ // RUN: not %clang_cl /guard:foo -### -- %s 2>&1 | FileCheck -check-prefix=CFGUARDINVALID %s // CFGUARDINVALID: invalid value 'foo' in '/guard:' +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_cl -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_cl -fdiagnostics-color -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=always -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=never -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" + // Accept "core" clang options. // (/Zs is for syntax-only, -Werror makes it fail hard on unknown options) // RUN: %clang_cl \ diff --git a/clang/test/Driver/dxc_options.hlsl b/clang/test/Driver/dxc_options.hlsl new file mode 100644 index 00..9bd4b61cdcf19d --- /dev/null +++ b/clang/test/Driver/dxc_options.hlsl @@ -0,0 +1,8 @@ +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=always -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=never -### %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" \ No newline at end of file diff --git a/clang/test/Driver/unknown-arg-drivermodes.test b/clang/test/Driver/unknown-arg-drivermodes.test index a7ea73af345e03..0125d79b47afa1 100644 --- a/clang/test/Driver/unknown-arg-drivermodes.test +++ b/clang/test/Driver/unknown-arg-drivermodes.test @@ -1,6 +1,5 @@ // RUN: %clang_cl \ // RUN: --config \ -// RUN: -fdiagnostics-color=auto \ // RUN: -fno-record-command-line \ // RUN: -frecord-command-line \ // RUN: -nodefaultlibs \ @@ -15,7 +14,6 @@ // RUN: not %clang_dxc \ // RUN: --config \ -// RUN: -fdiagnostics-color=auto \ // RUN: -fno-record-command-line \ // RUN: -frecord-command-line \ // RUN: -nodefaultlibs \ @@ -30,7 +28,6 @@ // RUN: | FileCheck %s --check-prefix=DXC --implicit-check-not="error:" // CL: warning: unknown argument ignored in clang-cl: '--config' -// CL: warning: unknown argument ignored in clang-cl: '-fdiagnostics-color=auto' // CL: warning: unknown argument ignored in clang-cl: '-fno-record-command-line' // CL: warning: unknown argument ignored in clang-cl: '-frecord-command-line' // CL: warning: unknown argument ignored in clang-cl: '-nodefaultlibs' @@ -42,7 +39,6 @@ // CL: warning: unknown argument ignored in clang-cl: '-Xoffload-linker' // DXC: error: unknown argument: '--config' -// DXC: error: unknown argument: '-fdiagnostics-color=auto' // DXC: error: unknown argument: '-fno-record-command-line' // DXC: error: unknown argument: '-frecord-command-line' // DXC: error: unknown argument: '-nodefaultlibs' ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc (PR #120644)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/120644 >From 770dec5aec1b879bafbc6c69b12a2e43c9497f7f Mon Sep 17 00:00:00 2001 From: Chris White Date: Thu, 19 Dec 2024 22:02:47 + Subject: [PATCH 1/2] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc --- clang/include/clang/Driver/Options.td | 2 +- clang/test/Driver/cl-options.c | 9 + clang/test/Driver/dxc_options.hlsl | 8 clang/test/Driver/unknown-arg-drivermodes.test | 4 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 clang/test/Driver/dxc_options.hlsl diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 638f8c52053ec5..ad64626d960d43 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1990,7 +1990,7 @@ def : Flag<["-"], "fno-diagnostics-color">, Group, Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Alias; def fdiagnostics_color_EQ : Joined<["-"], "fdiagnostics-color=">, Group, - Visibility<[ClangOption, FlangOption]>, + Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Values<"auto,always,never">, HelpText<"When to use colors in diagnostics">; def fansi_escape_codes : Flag<["-"], "fansi-escape-codes">, Group, diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 477e8489e74280..fe57a5232b2fdc 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -664,6 +664,15 @@ // RUN: not %clang_cl /guard:foo -### -- %s 2>&1 | FileCheck -check-prefix=CFGUARDINVALID %s // CFGUARDINVALID: invalid value 'foo' in '/guard:' +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_cl -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_cl -fdiagnostics-color -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=always -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=never -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" + // Accept "core" clang options. // (/Zs is for syntax-only, -Werror makes it fail hard on unknown options) // RUN: %clang_cl \ diff --git a/clang/test/Driver/dxc_options.hlsl b/clang/test/Driver/dxc_options.hlsl new file mode 100644 index 00..9bd4b61cdcf19d --- /dev/null +++ b/clang/test/Driver/dxc_options.hlsl @@ -0,0 +1,8 @@ +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=always -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=never -### %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" \ No newline at end of file diff --git a/clang/test/Driver/unknown-arg-drivermodes.test b/clang/test/Driver/unknown-arg-drivermodes.test index a7ea73af345e03..0125d79b47afa1 100644 --- a/clang/test/Driver/unknown-arg-drivermodes.test +++ b/clang/test/Driver/unknown-arg-drivermodes.test @@ -1,6 +1,5 @@ // RUN: %clang_cl \ // RUN: --config \ -// RUN: -fdiagnostics-color=auto \ // RUN: -fno-record-command-line \ // RUN: -frecord-command-line \ // RUN: -nodefaultlibs \ @@ -15,7 +14,6 @@ // RUN: not %clang_dxc \ // RUN: --config \ -// RUN: -fdiagnostics-color=auto \ // RUN: -fno-record-command-line \ // RUN: -frecord-command-line \ // RUN: -nodefaultlibs \ @@ -30,7 +28,6 @@ // RUN: | FileCheck %s --check-prefix=DXC --implicit-check-not="error:" // CL: warning: unknown argument ignored in clang-cl: '--config' -// CL: warning: unknown argument ignored in clang-cl: '-fdiagnostics-color=auto' // CL: warning: unknown argument ignored in clang-cl: '-fno-record-command-line' // CL: warning: unknown argument ignored in clang-cl: '-frecord-command-line' // CL: warning: unknown argument ignored in clang-cl: '-nodefaultlibs' @@ -42,7 +39,6 @@ // CL: warning: unknown argument ignored in clang-cl: '-Xoffload-linker' // DXC: error: unknown argument: '--config' -// DXC: error: unknown argument: '-fdiagnostics-color=auto' // DXC: error: unknown argument: '-fno-record-command-line' // DXC: error: unknown argument: '-frecord-command-line' // DXC: error: unknown argument: '-nodefaultlibs' >From bc06d22ca5508b7e72437bfba4c874b43e0f Mon Sep 17 00:00:00 2001 From: Chris White Date: Fri, 20 Dec 2024 20:40:09 + Subject: [PATCH 2/2] Address PR comments --- clang/docs/ReleaseNotes.rst| 3
[clang] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc (PR #120644)
whiteio wrote: Thanks @Maetveis, I've addressed the comments. https://github.com/llvm/llvm-project/pull/120644 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc (PR #120644)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/120644 >From 2d6d43abf0dfaa64a5cdd7bff3a3ecbef01635c2 Mon Sep 17 00:00:00 2001 From: Chris White Date: Thu, 19 Dec 2024 22:02:47 + Subject: [PATCH 1/2] [Clang-CL][DXC] Expose -fdiagnostic-color= to clang-cl and clang-dxc --- clang/include/clang/Driver/Options.td | 2 +- clang/test/Driver/cl-options.c | 9 + clang/test/Driver/dxc_options.hlsl | 8 clang/test/Driver/unknown-arg-drivermodes.test | 4 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 clang/test/Driver/dxc_options.hlsl diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 9edf308cc685ea..9e81c39f6869bd 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1990,7 +1990,7 @@ def : Flag<["-"], "fno-diagnostics-color">, Group, Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Alias; def fdiagnostics_color_EQ : Joined<["-"], "fdiagnostics-color=">, Group, - Visibility<[ClangOption, FlangOption]>, + Visibility<[ClangOption, CLOption, DXCOption, FlangOption]>, Values<"auto,always,never">, HelpText<"When to use colors in diagnostics">; def fansi_escape_codes : Flag<["-"], "fansi-escape-codes">, Group, diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 477e8489e74280..fe57a5232b2fdc 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -664,6 +664,15 @@ // RUN: not %clang_cl /guard:foo -### -- %s 2>&1 | FileCheck -check-prefix=CFGUARDINVALID %s // CFGUARDINVALID: invalid value 'foo' in '/guard:' +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_cl -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_cl -fdiagnostics-color -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=always -### -- %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_cl -fdiagnostics-color=never -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" + // Accept "core" clang options. // (/Zs is for syntax-only, -Werror makes it fail hard on unknown options) // RUN: %clang_cl \ diff --git a/clang/test/Driver/dxc_options.hlsl b/clang/test/Driver/dxc_options.hlsl new file mode 100644 index 00..9bd4b61cdcf19d --- /dev/null +++ b/clang/test/Driver/dxc_options.hlsl @@ -0,0 +1,8 @@ +// The test doesn't run in a PTY, so "auto" defaults to off. +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=auto -### -- %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s + +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=always -### %s 2>&1 | FileCheck -check-prefix=COLOR %s +// RUN: %clang_dxc -Tlib_6_7 -fdiagnostics-color=never -### %s 2>&1 | FileCheck -check-prefix=NO_COLOR %s +// COLOR: "-fcolor-diagnostics" +// NO_COLOR-NOT: "-fcolor-diagnostics" \ No newline at end of file diff --git a/clang/test/Driver/unknown-arg-drivermodes.test b/clang/test/Driver/unknown-arg-drivermodes.test index a7ea73af345e03..0125d79b47afa1 100644 --- a/clang/test/Driver/unknown-arg-drivermodes.test +++ b/clang/test/Driver/unknown-arg-drivermodes.test @@ -1,6 +1,5 @@ // RUN: %clang_cl \ // RUN: --config \ -// RUN: -fdiagnostics-color=auto \ // RUN: -fno-record-command-line \ // RUN: -frecord-command-line \ // RUN: -nodefaultlibs \ @@ -15,7 +14,6 @@ // RUN: not %clang_dxc \ // RUN: --config \ -// RUN: -fdiagnostics-color=auto \ // RUN: -fno-record-command-line \ // RUN: -frecord-command-line \ // RUN: -nodefaultlibs \ @@ -30,7 +28,6 @@ // RUN: | FileCheck %s --check-prefix=DXC --implicit-check-not="error:" // CL: warning: unknown argument ignored in clang-cl: '--config' -// CL: warning: unknown argument ignored in clang-cl: '-fdiagnostics-color=auto' // CL: warning: unknown argument ignored in clang-cl: '-fno-record-command-line' // CL: warning: unknown argument ignored in clang-cl: '-frecord-command-line' // CL: warning: unknown argument ignored in clang-cl: '-nodefaultlibs' @@ -42,7 +39,6 @@ // CL: warning: unknown argument ignored in clang-cl: '-Xoffload-linker' // DXC: error: unknown argument: '--config' -// DXC: error: unknown argument: '-fdiagnostics-color=auto' // DXC: error: unknown argument: '-fno-record-command-line' // DXC: error: unknown argument: '-frecord-command-line' // DXC: error: unknown argument: '-nodefaultlibs' >From 7756201f0e086e03f6e1b58da06796dbea9cb5f0 Mon Sep 17 00:00:00 2001 From: Chris White Date: Fri, 20 Dec 2024 20:40:09 + Subject: [PATCH 2/2] Address PR comments --- clang/docs/ReleaseNotes.rst| 3
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio edited https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/116871 >From c69426607d63b3a0cf7d839c82cde55273a5f942 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 19 Nov 2024 20:06:28 + Subject: [PATCH 1/2] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators Fix -Wunused-private-field suppressing warnings when defaulted comparison operators are declared as friend functions. The warning should only be suppressed for comparison operators that are class members. Fixes #116270 --- clang/lib/Sema/SemaDeclCXX.cpp | 2 +- clang/test/SemaCXX/warn-unused-private-field.cpp | 11 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 26041e53de5061..e115eb0a3d7e10 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); if (DefKind.isSpecialMember() diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index 1128eacc309d9f..bdd66807dca35f 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,6 +20,17 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; +}; + #endif class NotFullyDefined { >From c41cb5e89effd4f4a92131052ed6bb036a4159dc Mon Sep 17 00:00:00 2001 From: Chris White Date: Wed, 20 Nov 2024 18:34:52 + Subject: [PATCH 2/2] Address review comments --- clang/lib/Sema/SemaDeclCXX.cpp | 11 +-- clang/test/SemaCXX/warn-unused-private-field.cpp | 13 - 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e115eb0a3d7e10..ccc2d5304058a3 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,8 +7535,15 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison() && isa(FD->getDeclContext())) -UnusedPrivateFields.clear(); + if (DefKind.isComparison()) { +auto PT = FD->getParamDecl(0)->getType(); +if (const CXXRecordDecl *RD = +PT.getNonReferenceType()->getAsCXXRecordDecl()) { + for (FieldDecl *Field : RD->fields()) { +UnusedPrivateFields.remove(Field); + } +} + } if (DefKind.isSpecialMember() ? CheckExplicitlyDefaultedSpecialMember(cast(FD), diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index bdd66807dca35f..717b1864272140 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,17 +20,20 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; -class UnusedConstPrivateField { - public: - UnusedConstPrivateField() : unused_(0) {} - private: - const int unused_; // expected-warning{{private field 'unused_' is not used}} +class HasUnusedField { + int unused_; // expected-warning{{private field 'unused_' is not used}} }; class FriendEqDefaultCompare { + int used; friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; }; +class UnrelatedFriendEqDefaultCompare { + friend auto operator==(UnrelatedFriendEqDefaultCompare, UnrelatedFriendEqDefaultCompare) -> bool = default; + int operator<=>(const UnrelatedFriendEqDefaultCompare &) const = default; +}; + #endif class NotFullyDefined { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
https://github.com/whiteio updated https://github.com/llvm/llvm-project/pull/116871 >From ad14635ab12eb81a841db885962c95911722e4f2 Mon Sep 17 00:00:00 2001 From: Chris White Date: Tue, 19 Nov 2024 20:06:28 + Subject: [PATCH 1/3] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators Fix -Wunused-private-field suppressing warnings when defaulted comparison operators are declared as friend functions. The warning should only be suppressed for comparison operators that are class members. Fixes #116270 --- clang/lib/Sema/SemaDeclCXX.cpp | 2 +- clang/test/SemaCXX/warn-unused-private-field.cpp | 11 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 26041e53de5061..e115eb0a3d7e10 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,7 +7535,7 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison()) + if (DefKind.isComparison() && isa(FD->getDeclContext())) UnusedPrivateFields.clear(); if (DefKind.isSpecialMember() diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index 1128eacc309d9f..bdd66807dca35f 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,6 +20,17 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; +class UnusedConstPrivateField { + public: + UnusedConstPrivateField() : unused_(0) {} + private: + const int unused_; // expected-warning{{private field 'unused_' is not used}} +}; + +class FriendEqDefaultCompare { + friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; +}; + #endif class NotFullyDefined { >From 935aa2edb4596f944d1477638b3654a94aad711e Mon Sep 17 00:00:00 2001 From: Chris White Date: Wed, 20 Nov 2024 18:34:52 + Subject: [PATCH 2/3] Address review comments --- clang/lib/Sema/SemaDeclCXX.cpp | 11 +-- clang/test/SemaCXX/warn-unused-private-field.cpp | 13 - 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e115eb0a3d7e10..ccc2d5304058a3 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7535,8 +7535,15 @@ void Sema::CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *FD) { return; } - if (DefKind.isComparison() && isa(FD->getDeclContext())) -UnusedPrivateFields.clear(); + if (DefKind.isComparison()) { +auto PT = FD->getParamDecl(0)->getType(); +if (const CXXRecordDecl *RD = +PT.getNonReferenceType()->getAsCXXRecordDecl()) { + for (FieldDecl *Field : RD->fields()) { +UnusedPrivateFields.remove(Field); + } +} + } if (DefKind.isSpecialMember() ? CheckExplicitlyDefaultedSpecialMember(cast(FD), diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index bdd66807dca35f..717b1864272140 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -20,17 +20,20 @@ class SpaceShipDefaultCompare { int operator<=>(const SpaceShipDefaultCompare &) const = default; }; -class UnusedConstPrivateField { - public: - UnusedConstPrivateField() : unused_(0) {} - private: - const int unused_; // expected-warning{{private field 'unused_' is not used}} +class HasUnusedField { + int unused_; // expected-warning{{private field 'unused_' is not used}} }; class FriendEqDefaultCompare { + int used; friend auto operator==(FriendEqDefaultCompare, FriendEqDefaultCompare) -> bool = default; }; +class UnrelatedFriendEqDefaultCompare { + friend auto operator==(UnrelatedFriendEqDefaultCompare, UnrelatedFriendEqDefaultCompare) -> bool = default; + int operator<=>(const UnrelatedFriendEqDefaultCompare &) const = default; +}; + #endif class NotFullyDefined { >From 63a93bad10008eeff2f461b94686a6ddf06f0674 Mon Sep 17 00:00:00 2001 From: Chris White Date: Sat, 23 Nov 2024 14:55:47 + Subject: [PATCH 3/3] Update release notes --- clang/docs/ReleaseNotes.rst | 14 ++ 1 file changed, 14 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 8bd06fadfdc984..188681f99ee5c5 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -583,6 +583,20 @@ Improvements to Clang's diagnostics - For an rvalue reference bound to a temporary struct with an integer member, Clang will detect constant integer overflow in the initializer for the integer member (#GH46755). +- Fixed a bug where Clang would not emit ``-Wunused-private-field`` warnings when an unrelated class + defined
[clang] [Clang] Fix -Wunused-private-field false negative with defaulted comparison operators (PR #116871)
whiteio wrote: Thanks for that @Maetveis! I've updated the release notes. https://github.com/llvm/llvm-project/pull/116871 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits