Skip to content

Commit 1b70794

Browse files
committed
Cleanup addImplicitInheritedConstructorsToClass
This commit removes some code that's no longer needed. In addition, now that we've requestified `inheritsSuperclassInitializers`, we can directly diagnose on non-inherited required convenience inits within the loop.
1 parent 5de09fb commit 1b70794

File tree

1 file changed

+7
-27
lines changed

1 file changed

+7
-27
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -922,16 +922,12 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
922922

923923
auto &ctx = decl->getASTContext();
924924
SmallVector<std::pair<ValueDecl *, Type>, 4> declaredInitializers;
925-
llvm::SmallPtrSet<ConstructorDecl *, 4> overriddenInits;
926925
for (auto member : decl->getMembers()) {
927926
if (auto ctor = dyn_cast<ConstructorDecl>(member)) {
928927
if (!ctor->isInvalid()) {
929928
auto type = getMemberTypeForComparison(ctx, ctor, nullptr);
930929
declaredInitializers.push_back({ctor, type});
931930
}
932-
933-
if (auto overridden = ctor->getOverriddenDecl())
934-
overriddenInits.insert(overridden);
935931
}
936932
}
937933

@@ -955,28 +951,18 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
955951
if (!defaultInitable && !foundDesignatedInit)
956952
return;
957953

958-
auto *superclassDecl = superclassTy->getClassOrBoundGenericClass();
959-
assert(superclassDecl && "Superclass of class is not a class?");
960-
if (!superclassDecl->addedImplicitInitializers())
961-
ctx.getLazyResolver()->resolveImplicitConstructors(superclassDecl);
962-
963-
auto ctors = TypeChecker::lookupConstructors(
964-
decl, superclassTy,
965-
NameLookupFlags::IgnoreAccessControl);
966-
967-
bool canInheritInitializers = defaultInitable && !foundDesignatedInit;
968-
969-
SmallVector<ConstructorDecl *, 4> requiredConvenienceInitializers;
970954
SmallVector<ConstructorDecl *, 4> nonOverridenSuperclassCtors;
971955
collectNonOveriddenSuperclassInits(decl, nonOverridenSuperclassCtors);
972956

957+
bool inheritDesignatedInits = canInheritDesignatedInits(ctx.evaluator, decl);
973958
for (auto *superclassCtor : nonOverridenSuperclassCtors) {
974959
// We only care about required or designated initializers.
975960
if (!superclassCtor->isDesignatedInit()) {
976961
if (superclassCtor->isRequired()) {
977962
assert(superclassCtor->isInheritable() &&
978963
"factory initializers cannot be 'required'");
979-
requiredConvenienceInitializers.push_back(superclassCtor);
964+
if (!decl->inheritsSuperclassInitializers())
965+
diagnoseMissingRequiredInitializer(decl, superclassCtor, ctx);
980966
}
981967
continue;
982968
}
@@ -991,7 +977,7 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
991977
continue;
992978

993979
// Diagnose a missing override of a required initializer.
994-
if (superclassCtor->isRequired() && !canInheritInitializers) {
980+
if (superclassCtor->isRequired() && !inheritDesignatedInits) {
995981
diagnoseMissingRequiredInitializer(decl, superclassCtor, ctx);
996982
continue;
997983
}
@@ -1002,8 +988,7 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1002988
for (const auto &ctorAndType : declaredInitializers) {
1003989
auto *ctor = ctorAndType.first;
1004990
auto type = ctorAndType.second;
1005-
auto parentType = getMemberTypeForComparison(
1006-
ctx, superclassCtor, ctor);
991+
auto parentType = getMemberTypeForComparison(ctx, superclassCtor, ctor);
1007992

1008993
if (isOverrideBasedOnType(ctor, type, superclassCtor, parentType)) {
1009994
alreadyDeclared = true;
@@ -1018,19 +1003,14 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
10181003

10191004
// If we're inheriting initializers, create an override delegating
10201005
// to 'super.init'. Otherwise, create a stub which traps at runtime.
1021-
auto kind = canInheritInitializers
1022-
? DesignatedInitKind::Chaining
1023-
: DesignatedInitKind::Stub;
1006+
auto kind = inheritDesignatedInits ? DesignatedInitKind::Chaining
1007+
: DesignatedInitKind::Stub;
10241008

10251009
if (auto ctor = createDesignatedInitOverride(
10261010
decl, superclassCtor, kind, ctx)) {
10271011
decl->addMember(ctor);
10281012
}
10291013
}
1030-
1031-
if (!decl->inheritsSuperclassInitializers())
1032-
for (ConstructorDecl *requiredCtor : requiredConvenienceInitializers)
1033-
diagnoseMissingRequiredInitializer(decl, requiredCtor, ctx);
10341014
}
10351015

10361016
llvm::Expected<bool>

0 commit comments

Comments
 (0)