Author: Hans Wennborg Date: 2023-08-30T09:06:39+02:00 New Revision: a4fbc091846206fb6f5bc36115d65075764b51ea
URL: https://github.com/llvm/llvm-project/commit/a4fbc091846206fb6f5bc36115d65075764b51ea DIFF: https://github.com/llvm/llvm-project/commit/a4fbc091846206fb6f5bc36115d65075764b51ea.diff LOG: Clang: Don't warn about unused private fields of types declared maybe_unused The compiler should not warn on code such as: class [[maybe_unused]] MaybeUnusedClass {}; class C { MaybeUnusedClass c; }; Patch based on comments on the bug by Shafik and Aaron. Fixes #61334 Differential revision: https://reviews.llvm.org/D159083 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaDeclCXX.cpp clang/test/SemaCXX/warn-unused-private-field.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 1bd295c68b83b7..1e273c1b7ce46a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -202,6 +202,9 @@ Bug Fixes in This Version - Clang now emits an error if it is not possible to deduce array size for a variable with incomplete array type. (`#37257 <https://github.com/llvm/llvm-project/issues/37257>`_) +- Clang's ``-Wunused-private-field`` no longer warns on fields whose type is + declared with ``[[maybe_unused]]``. + (`#61334 <https://github.com/llvm/llvm-project/issues/61334>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index a7ab0948d01bf3..2b2b7391f88fd5 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3729,10 +3729,20 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, if (!Diags.isIgnored(diag::warn_unused_private_field, FD->getLocation())) { // Remember all explicit private FieldDecls that have a name, no side // effects and are not part of a dependent type declaration. + + auto DeclHasUnusedAttr = [](const QualType &T) { + if (const TagDecl *TD = T->getAsTagDecl()) + return TD->hasAttr<UnusedAttr>(); + if (const TypedefType *TDT = T->getAs<TypedefType>()) + return TDT->getDecl()->hasAttr<UnusedAttr>(); + return false; + }; + if (!FD->isImplicit() && FD->getDeclName() && FD->getAccess() == AS_private && !FD->hasAttr<UnusedAttr>() && !FD->getParent()->isDependentContext() && + !DeclHasUnusedAttr(FD->getType()) && !InitializationHasSideEffects(*FD)) UnusedPrivateFields.insert(FD); } diff --git a/clang/test/SemaCXX/warn-unused-private-field.cpp b/clang/test/SemaCXX/warn-unused-private-field.cpp index e67603eaceae66..1128eacc309d9f 100644 --- a/clang/test/SemaCXX/warn-unused-private-field.cpp +++ b/clang/test/SemaCXX/warn-unused-private-field.cpp @@ -284,3 +284,14 @@ class defaulted_special_member { private: int n; // expected-warning{{private field 'n' is not used}} }; + +namespace pr61334 { +class [[maybe_unused]] MaybeUnusedClass {}; +enum [[maybe_unused]] MaybeUnusedEnum {}; +typedef int MaybeUnusedTypedef [[maybe_unused]]; +class C { + MaybeUnusedClass c; // no-warning + MaybeUnusedEnum e; // no-warning + MaybeUnusedTypedef t; // no-warning +}; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits