diff options
author | Mészáros Gergely <gergely.meszaros@intel.com> | 2024-11-26 15:16:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-26 15:16:50 +0100 |
commit | 9efdebc5f15e284dc7c58d327057ec8af9eed342 (patch) | |
tree | bed0b145790aac5770509c75924ec8688b3a28ff /clang/lib/Sema/SemaExprMember.cpp | |
parent | ab6677e7d64b4612d6c92877cb1d529f922268d2 (diff) | |
download | llvm-9efdebc5f15e284dc7c58d327057ec8af9eed342.zip llvm-9efdebc5f15e284dc7c58d327057ec8af9eed342.tar.gz llvm-9efdebc5f15e284dc7c58d327057ec8af9eed342.tar.bz2 |
[Clang] Only ignore special methods for unused private fields in BuildFieldReferenceExpr (#116965)
The original code assumed that only special methods might be defined as
defaulted. Since C++20 comparison operators might be defaulted too, and
we *do* want to consider those as using the fields of the class.
Fixes: #116961
Diffstat (limited to 'clang/lib/Sema/SemaExprMember.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprMember.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp index 434768b9..85d5dfcb 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1874,8 +1874,16 @@ Sema::BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, Context.getAttributedType(attr::NoDeref, MemberType, MemberType); } - auto *CurMethod = dyn_cast<CXXMethodDecl>(CurContext); - if (!(CurMethod && CurMethod->isDefaulted())) + auto isDefaultedSpecialMember = [this](const DeclContext *Ctx) { + auto *Method = dyn_cast<CXXMethodDecl>(CurContext); + if (!Method || !Method->isDefaulted()) + return false; + + return getDefaultedFunctionKind(Method).isSpecialMember(); + }; + + // Implicit special members should not mark fields as used. + if (!isDefaultedSpecialMember(CurContext)) UnusedPrivateFields.remove(Field); ExprResult Base = PerformObjectMemberConversion(BaseExpr, SS.getScopeRep(), |