aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaExprMember.cpp
diff options
context:
space:
mode:
authorMészáros Gergely <gergely.meszaros@intel.com>2024-11-26 15:16:50 +0100
committerGitHub <noreply@github.com>2024-11-26 15:16:50 +0100
commit9efdebc5f15e284dc7c58d327057ec8af9eed342 (patch)
treebed0b145790aac5770509c75924ec8688b3a28ff /clang/lib/Sema/SemaExprMember.cpp
parentab6677e7d64b4612d6c92877cb1d529f922268d2 (diff)
downloadllvm-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.cpp12
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(),