@@ -922,16 +922,12 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
922
922
923
923
auto &ctx = decl->getASTContext ();
924
924
SmallVector<std::pair<ValueDecl *, Type>, 4 > declaredInitializers;
925
- llvm::SmallPtrSet<ConstructorDecl *, 4 > overriddenInits;
926
925
for (auto member : decl->getMembers ()) {
927
926
if (auto ctor = dyn_cast<ConstructorDecl>(member)) {
928
927
if (!ctor->isInvalid ()) {
929
928
auto type = getMemberTypeForComparison (ctx, ctor, nullptr );
930
929
declaredInitializers.push_back ({ctor, type});
931
930
}
932
-
933
- if (auto overridden = ctor->getOverriddenDecl ())
934
- overriddenInits.insert (overridden);
935
931
}
936
932
}
937
933
@@ -955,28 +951,18 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
955
951
if (!defaultInitable && !foundDesignatedInit)
956
952
return ;
957
953
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;
970
954
SmallVector<ConstructorDecl *, 4 > nonOverridenSuperclassCtors;
971
955
collectNonOveriddenSuperclassInits (decl, nonOverridenSuperclassCtors);
972
956
957
+ bool inheritDesignatedInits = canInheritDesignatedInits (ctx.evaluator , decl);
973
958
for (auto *superclassCtor : nonOverridenSuperclassCtors) {
974
959
// We only care about required or designated initializers.
975
960
if (!superclassCtor->isDesignatedInit ()) {
976
961
if (superclassCtor->isRequired ()) {
977
962
assert (superclassCtor->isInheritable () &&
978
963
" factory initializers cannot be 'required'" );
979
- requiredConvenienceInitializers.push_back (superclassCtor);
964
+ if (!decl->inheritsSuperclassInitializers ())
965
+ diagnoseMissingRequiredInitializer (decl, superclassCtor, ctx);
980
966
}
981
967
continue ;
982
968
}
@@ -991,7 +977,7 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
991
977
continue ;
992
978
993
979
// Diagnose a missing override of a required initializer.
994
- if (superclassCtor->isRequired () && !canInheritInitializers ) {
980
+ if (superclassCtor->isRequired () && !inheritDesignatedInits ) {
995
981
diagnoseMissingRequiredInitializer (decl, superclassCtor, ctx);
996
982
continue ;
997
983
}
@@ -1002,8 +988,7 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1002
988
for (const auto &ctorAndType : declaredInitializers) {
1003
989
auto *ctor = ctorAndType.first ;
1004
990
auto type = ctorAndType.second ;
1005
- auto parentType = getMemberTypeForComparison (
1006
- ctx, superclassCtor, ctor);
991
+ auto parentType = getMemberTypeForComparison (ctx, superclassCtor, ctor);
1007
992
1008
993
if (isOverrideBasedOnType (ctor, type, superclassCtor, parentType)) {
1009
994
alreadyDeclared = true ;
@@ -1018,19 +1003,14 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1018
1003
1019
1004
// If we're inheriting initializers, create an override delegating
1020
1005
// 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;
1024
1008
1025
1009
if (auto ctor = createDesignatedInitOverride (
1026
1010
decl, superclassCtor, kind, ctx)) {
1027
1011
decl->addMember (ctor);
1028
1012
}
1029
1013
}
1030
-
1031
- if (!decl->inheritsSuperclassInitializers ())
1032
- for (ConstructorDecl *requiredCtor : requiredConvenienceInitializers)
1033
- diagnoseMissingRequiredInitializer (decl, requiredCtor, ctx);
1034
1014
}
1035
1015
1036
1016
llvm::Expected<bool >
0 commit comments