aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorVlad Serebrennikov <serebrennikov.vladislav@gmail.com>2024-04-12 12:20:22 +0300
committerVlad Serebrennikov <serebrennikov.vladislav@gmail.com>2024-04-12 12:21:14 +0300
commitd019b9aaaaa60c858ee82fdbaf5de16e048e9db2 (patch)
tree89a46bd6f2e41600c6fb119ed4d569c8bfbca1a0 /clang/lib/Sema/SemaDecl.cpp
parentd488b2225d484027eb2c21a06d27decf008e878b (diff)
downloadllvm-d019b9aaaaa60c858ee82fdbaf5de16e048e9db2.zip
llvm-d019b9aaaaa60c858ee82fdbaf5de16e048e9db2.tar.gz
llvm-d019b9aaaaa60c858ee82fdbaf5de16e048e9db2.tar.bz2
[clang][NFC] Refactor `CXXSpecialMember`
In preparation for `SemaCUDA`, which requires this enum to be forward-declarable.
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp51
1 files changed, 29 insertions, 22 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index afd9e407..b448bac 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -48,6 +48,7 @@
#include "clang/Sema/SemaHLSL.h"
#include "clang/Sema/SemaInternal.h"
#include "clang/Sema/Template.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/TargetParser/Triple.h"
@@ -4049,13 +4050,13 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S,
} else {
Diag(NewMethod->getLocation(),
diag::err_definition_of_implicitly_declared_member)
- << New << getSpecialMember(OldMethod);
+ << New << llvm::to_underlying(getSpecialMember(OldMethod));
return true;
}
} else if (OldMethod->getFirstDecl()->isExplicitlyDefaulted() && !isFriend) {
Diag(NewMethod->getLocation(),
diag::err_definition_of_explicitly_defaulted_member)
- << getSpecialMember(OldMethod);
+ << llvm::to_underlying(getSpecialMember(OldMethod));
return true;
}
}
@@ -18847,22 +18848,22 @@ bool Sema::CheckNontrivialField(FieldDecl *FD) {
// because otherwise we'll never get complaints about
// copy constructors.
- CXXSpecialMember member = CXXInvalid;
+ CXXSpecialMemberKind member = CXXSpecialMemberKind::Invalid;
// We're required to check for any non-trivial constructors. Since the
// implicit default constructor is suppressed if there are any
// user-declared constructors, we just need to check that there is a
// trivial default constructor and a trivial copy constructor. (We don't
// worry about move constructors here, since this is a C++98 check.)
if (RDecl->hasNonTrivialCopyConstructor())
- member = CXXCopyConstructor;
+ member = CXXSpecialMemberKind::CopyConstructor;
else if (!RDecl->hasTrivialDefaultConstructor())
- member = CXXDefaultConstructor;
+ member = CXXSpecialMemberKind::DefaultConstructor;
else if (RDecl->hasNonTrivialCopyAssignment())
- member = CXXCopyAssignment;
+ member = CXXSpecialMemberKind::CopyAssignment;
else if (RDecl->hasNonTrivialDestructor())
- member = CXXDestructor;
+ member = CXXSpecialMemberKind::Destructor;
- if (member != CXXInvalid) {
+ if (member != CXXSpecialMemberKind::Invalid) {
if (!getLangOpts().CPlusPlus11 &&
getLangOpts().ObjCAutoRefCount && RDecl->hasObjectMember()) {
// Objective-C++ ARC: it is an error to have a non-trivial field of
@@ -18879,10 +18880,13 @@ bool Sema::CheckNontrivialField(FieldDecl *FD) {
}
}
- Diag(FD->getLocation(), getLangOpts().CPlusPlus11 ?
- diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member :
- diag::err_illegal_union_or_anon_struct_member)
- << FD->getParent()->isUnion() << FD->getDeclName() << member;
+ Diag(
+ FD->getLocation(),
+ getLangOpts().CPlusPlus11
+ ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
+ : diag::err_illegal_union_or_anon_struct_member)
+ << FD->getParent()->isUnion() << FD->getDeclName()
+ << llvm::to_underlying(member);
DiagnoseNontrivial(RDecl, member);
return !getLangOpts().CPlusPlus11;
}
@@ -19132,10 +19136,10 @@ static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record) {
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context,
CXXMethodDecl *M1,
CXXMethodDecl *M2,
- Sema::CXXSpecialMember CSM) {
+ CXXSpecialMemberKind CSM) {
// We don't want to compare templates to non-templates: See
// https://github.com/llvm/llvm-project/issues/59206
- if (CSM == Sema::CXXDefaultConstructor)
+ if (CSM == CXXSpecialMemberKind::DefaultConstructor)
return bool(M1->getDescribedFunctionTemplate()) ==
bool(M2->getDescribedFunctionTemplate());
// FIXME: better resolve CWG
@@ -19158,7 +19162,7 @@ static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context,
/// [CWG2595], if any, are satisfied is more constrained.
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record,
ArrayRef<CXXMethodDecl *> Methods,
- Sema::CXXSpecialMember CSM) {
+ CXXSpecialMemberKind CSM) {
SmallVector<bool, 4> SatisfactionStatus;
for (CXXMethodDecl *Method : Methods) {
@@ -19216,7 +19220,8 @@ static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record,
// DR1734 and DR1496.
if (!AnotherMethodIsMoreConstrained) {
Method->setIneligibleOrNotSelected(false);
- Record->addedEligibleSpecialMemberFunction(Method, 1 << CSM);
+ Record->addedEligibleSpecialMemberFunction(Method,
+ 1 << llvm::to_underlying(CSM));
}
}
}
@@ -19255,13 +19260,15 @@ static void ComputeSpecialMemberFunctionsEligiblity(Sema &S,
}
SetEligibleMethods(S, Record, DefaultConstructors,
- Sema::CXXDefaultConstructor);
- SetEligibleMethods(S, Record, CopyConstructors, Sema::CXXCopyConstructor);
- SetEligibleMethods(S, Record, MoveConstructors, Sema::CXXMoveConstructor);
+ CXXSpecialMemberKind::DefaultConstructor);
+ SetEligibleMethods(S, Record, CopyConstructors,
+ CXXSpecialMemberKind::CopyConstructor);
+ SetEligibleMethods(S, Record, MoveConstructors,
+ CXXSpecialMemberKind::MoveConstructor);
SetEligibleMethods(S, Record, CopyAssignmentOperators,
- Sema::CXXCopyAssignment);
+ CXXSpecialMemberKind::CopyAssignment);
SetEligibleMethods(S, Record, MoveAssignmentOperators,
- Sema::CXXMoveAssignment);
+ CXXSpecialMemberKind::MoveAssignment);
}
void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
@@ -19630,7 +19637,7 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
if (CXXRecord) {
auto *Dtor = CXXRecord->getDestructor();
if (Dtor && Dtor->isImplicit() &&
- ShouldDeleteSpecialMember(Dtor, CXXDestructor)) {
+ ShouldDeleteSpecialMember(Dtor, CXXSpecialMemberKind::Destructor)) {
CXXRecord->setImplicitDestructorIsDeleted();
SetDeclDeleted(Dtor, CXXRecord->getLocation());
}