Skip to content

Commit 9aca8e1

Browse files
committed
Sema: Move most of DeclChecker::visitDestructorDecl() to validateDecl()
1 parent 712b0e4 commit 9aca8e1

File tree

3 files changed

+70
-64
lines changed

3 files changed

+70
-64
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 55 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -4747,17 +4747,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47474747
// PatternBindingDecl.
47484748
}
47494749

4750-
bool semaFuncParamPatterns(AbstractFunctionDecl *fd,
4751-
GenericTypeResolver &resolver) {
4752-
bool hadError = false;
4753-
for (auto paramList : fd->getParameterLists()) {
4754-
hadError |= TC.typeCheckParameterList(paramList, fd,
4755-
TypeResolutionOptions(), resolver);
4756-
}
4757-
4758-
return hadError;
4759-
}
4760-
47614750
static TypeLoc getTypeLocForFunctionResult(FuncDecl *FD) {
47624751
auto accessor = dyn_cast<AccessorDecl>(FD);
47634752
if (!accessor) {
@@ -4789,7 +4778,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47894778
}
47904779
}
47914780

4792-
badType |= semaFuncParamPatterns(FD, resolver);
4781+
badType |= TC.typeCheckParameterLists(FD, resolver);
47934782

47944783
if (badType) {
47954784
FD->setInterfaceType(ErrorType::get(TC.Context));
@@ -7027,7 +7016,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
70277016

70287017
// Type check the constructor parameters.
70297018
GenericTypeToArchetypeResolver resolver(CD);
7030-
if (semaFuncParamPatterns(CD, resolver) || CD->isInvalid()) {
7019+
if (TC.typeCheckParameterLists(CD, resolver) || CD->isInvalid()) {
70317020
CD->setInterfaceType(ErrorType::get(TC.Context));
70327021
CD->setInvalid();
70337022
} else {
@@ -7160,62 +7149,14 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
71607149
}
71617150

71627151
void visitDestructorDecl(DestructorDecl *DD) {
7163-
auto enclosingClass = dyn_cast<ClassDecl>(DD->getDeclContext());
7164-
if (DD->isInvalid() ||
7165-
enclosingClass == nullptr) {
7166-
DD->setInterfaceType(ErrorType::get(TC.Context));
7167-
DD->setInvalid();
7168-
return;
7169-
}
7170-
71717152
if (!IsFirstPass) {
71727153
if (DD->getBody())
71737154
TC.definedFunctions.push_back(DD);
7174-
}
71757155

7176-
if (!IsFirstPass ||
7177-
DD->hasInterfaceType() ||
7178-
DD->isBeingValidated()) {
71797156
return;
71807157
}
71817158

7182-
DD->setIsBeingValidated();
7183-
7184-
assert(DD->getDeclContext()->isTypeContext()
7185-
&& "Decl parsing must prevent destructors outside of types!");
7186-
7187-
TC.checkDeclAttributesEarly(DD);
7188-
DD->copyFormalAccessAndVersionedAttrFrom(enclosingClass);
7189-
7190-
configureImplicitSelf(TC, DD);
7191-
7192-
if (DD->getDeclContext()->getGenericSignatureOfContext()) {
7193-
(void)TC.validateGenericFuncSignature(DD);
7194-
DD->setGenericEnvironment(
7195-
DD->getDeclContext()->getGenericEnvironmentOfContext());
7196-
}
7197-
7198-
// Set the context type of 'self'.
7199-
recordSelfContextType(DD);
7200-
7201-
GenericTypeToArchetypeResolver resolver(DD);
7202-
if (semaFuncParamPatterns(DD, resolver)) {
7203-
DD->setInterfaceType(ErrorType::get(TC.Context));
7204-
DD->setInvalid();
7205-
}
7206-
7207-
if (!DD->getGenericSignatureOfContext())
7208-
TC.configureInterfaceType(DD, DD->getGenericSignature());
7209-
7210-
DD->setIsBeingValidated(false);
7211-
7212-
// Do this before markAsObjC() to diagnose @nonobjc better
7213-
validateAttributes(TC, DD);
7214-
7215-
// Destructors are always @objc, because their Objective-C entry point is
7216-
// -dealloc.
7217-
markAsObjC(TC, DD, ObjCReason::ImplicitlyObjC);
7218-
7159+
TC.validateDecl(DD);
72197160
TC.checkDeclAttributes(DD);
72207161
}
72217162
};
@@ -7725,12 +7666,62 @@ void TypeChecker::validateDecl(ValueDecl *D) {
77257666

77267667
case DeclKind::Func:
77277668
case DeclKind::Accessor:
7728-
case DeclKind::Constructor:
7729-
case DeclKind::Destructor: {
7669+
case DeclKind::Constructor: {
77307670
typeCheckDecl(D, true);
77317671
break;
77327672
}
77337673

7674+
case DeclKind::Destructor: {
7675+
auto *DD = cast<DestructorDecl>(D);
7676+
7677+
auto enclosingClass = dyn_cast<ClassDecl>(DD->getDeclContext());
7678+
if (DD->isInvalid() ||
7679+
enclosingClass == nullptr) {
7680+
DD->setInterfaceType(ErrorType::get(Context));
7681+
DD->setInvalid();
7682+
return;
7683+
}
7684+
7685+
DD->setIsBeingValidated();
7686+
7687+
assert(DD->getDeclContext()->isTypeContext()
7688+
&& "Decl parsing must prevent destructors outside of types!");
7689+
7690+
checkDeclAttributesEarly(DD);
7691+
DD->copyFormalAccessAndVersionedAttrFrom(enclosingClass);
7692+
7693+
configureImplicitSelf(*this, DD);
7694+
7695+
if (DD->getDeclContext()->getGenericSignatureOfContext()) {
7696+
(void)validateGenericFuncSignature(DD);
7697+
DD->setGenericEnvironment(
7698+
DD->getDeclContext()->getGenericEnvironmentOfContext());
7699+
}
7700+
7701+
// Set the context type of 'self'.
7702+
recordSelfContextType(DD);
7703+
7704+
GenericTypeToArchetypeResolver resolver(DD);
7705+
if (typeCheckParameterLists(DD, resolver)) {
7706+
DD->setInterfaceType(ErrorType::get(Context));
7707+
DD->setInvalid();
7708+
}
7709+
7710+
if (!DD->getGenericSignatureOfContext())
7711+
configureInterfaceType(DD, DD->getGenericSignature());
7712+
7713+
DD->setIsBeingValidated(false);
7714+
7715+
// Do this before markAsObjC() to diagnose @nonobjc better
7716+
validateAttributes(*this, DD);
7717+
7718+
// Destructors are always @objc, because their Objective-C entry point is
7719+
// -dealloc.
7720+
markAsObjC(*this, DD, ObjCReason::ImplicitlyObjC);
7721+
7722+
break;
7723+
}
7724+
77347725
case DeclKind::Subscript: {
77357726
auto *SD = cast<SubscriptDecl>(D);
77367727

lib/Sema/TypeCheckPattern.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,17 @@ bool TypeChecker::typeCheckParameterList(ParameterList *PL, DeclContext *DC,
876876
return hadError;
877877
}
878878

879+
bool TypeChecker::typeCheckParameterLists(AbstractFunctionDecl *fd,
880+
GenericTypeResolver &resolver) {
881+
bool hadError = false;
882+
for (auto paramList : fd->getParameterLists()) {
883+
hadError |= typeCheckParameterList(paramList, fd,
884+
TypeResolutionOptions(),
885+
resolver);
886+
}
887+
888+
return hadError;
889+
}
879890

880891
bool TypeChecker::typeCheckPattern(Pattern *P, DeclContext *dc,
881892
TypeResolutionOptions options) {

lib/Sema/TypeChecker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,10 @@ class TypeChecker final : public LazyResolver {
18221822
TypeResolutionOptions options,
18231823
GenericTypeResolver &resolver);
18241824

1825+
/// Type check all parameter lists of a function.
1826+
bool typeCheckParameterLists(AbstractFunctionDecl *fd,
1827+
GenericTypeResolver &resolver);
1828+
18251829
/// Coerce a pattern to the given type.
18261830
///
18271831
/// \param P The pattern, which may be modified by this coercion.

0 commit comments

Comments
 (0)