@@ -990,10 +990,16 @@ HasUserDefinedDesignatedInitRequest::evaluate(Evaluator &evaluator,
990
990
NominalTypeDecl *decl) const {
991
991
assert (!decl->hasClangNode ());
992
992
993
- for (auto *member : decl->getMembers ())
994
- if (auto *ctor = dyn_cast<ConstructorDecl>(member))
995
- if (ctor->isDesignatedInit () && !ctor->isSynthesized ())
996
- return true ;
993
+ auto results = decl->lookupDirect (DeclBaseName::createConstructor ());
994
+ for (auto *member : results) {
995
+ if (isa<ExtensionDecl>(member->getDeclContext ()))
996
+ continue ;
997
+
998
+ auto *ctor = cast<ConstructorDecl>(member);
999
+ if (ctor->isDesignatedInit () && !ctor->isSynthesized ())
1000
+ return true ;
1001
+ }
1002
+
997
1003
return false ;
998
1004
}
999
1005
@@ -1024,11 +1030,17 @@ static void collectNonOveriddenSuperclassInits(
1024
1030
// overrides, which we don't want to consider as viable delegates for
1025
1031
// convenience inits.
1026
1032
llvm::SmallPtrSet<ConstructorDecl *, 4 > overriddenInits;
1027
- for (auto member : subclass->getMembers ())
1028
- if (auto ctor = dyn_cast<ConstructorDecl>(member))
1029
- if (!ctor->hasStubImplementation ())
1030
- if (auto overridden = ctor->getOverriddenDecl ())
1031
- overriddenInits.insert (overridden);
1033
+
1034
+ auto ctors = subclass->lookupDirect (DeclBaseName::createConstructor ());
1035
+ for (auto *member : ctors) {
1036
+ if (isa<ExtensionDecl>(member->getDeclContext ()))
1037
+ continue ;
1038
+
1039
+ auto *ctor = cast<ConstructorDecl>(member);
1040
+ if (!ctor->hasStubImplementation ())
1041
+ if (auto overridden = ctor->getOverriddenDecl ())
1042
+ overriddenInits.insert (overridden);
1043
+ }
1032
1044
1033
1045
superclassDecl->synthesizeSemanticMembersIfNeeded (
1034
1046
DeclBaseName::createConstructor ());
@@ -1060,11 +1072,13 @@ static void collectNonOveriddenSuperclassInits(
1060
1072
static void addImplicitInheritedConstructorsToClass (ClassDecl *decl) {
1061
1073
// Bail out if we're validating one of our constructors already;
1062
1074
// we'll revisit the issue later.
1063
- for (auto member : decl->getMembers ()) {
1064
- if (auto ctor = dyn_cast<ConstructorDecl>(member)) {
1065
- if (ctor->isRecursiveValidation ())
1066
- return ;
1067
- }
1075
+ auto results = decl->lookupDirect (DeclBaseName::createConstructor ());
1076
+ for (auto *member : results) {
1077
+ if (isa<ExtensionDecl>(member->getDeclContext ()))
1078
+ continue ;
1079
+
1080
+ if (member->isRecursiveValidation ())
1081
+ return ;
1068
1082
}
1069
1083
1070
1084
decl->setAddedImplicitInitializers ();
@@ -1119,17 +1133,22 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1119
1133
// A designated or required initializer has not been overridden.
1120
1134
1121
1135
bool alreadyDeclared = false ;
1122
- for (auto *member : decl->getMembers ()) {
1123
- if (auto ctor = dyn_cast<ConstructorDecl>(member)) {
1124
- // Skip any invalid constructors.
1125
- if (ctor->isInvalid ())
1126
- continue ;
1127
-
1128
- auto type = swift::getMemberTypeForComparison (ctor, nullptr );
1129
- if (isOverrideBasedOnType (ctor, type, superclassCtor)) {
1130
- alreadyDeclared = true ;
1131
- break ;
1132
- }
1136
+
1137
+ auto results = decl->lookupDirect (DeclBaseName::createConstructor ());
1138
+ for (auto *member : results) {
1139
+ if (isa<ExtensionDecl>(member->getDeclContext ()))
1140
+ continue ;
1141
+
1142
+ auto *ctor = cast<ConstructorDecl>(member);
1143
+
1144
+ // Skip any invalid constructors.
1145
+ if (ctor->isInvalid ())
1146
+ continue ;
1147
+
1148
+ auto type = swift::getMemberTypeForComparison (ctor, nullptr );
1149
+ if (isOverrideBasedOnType (ctor, type, superclassCtor)) {
1150
+ alreadyDeclared = true ;
1151
+ break ;
1133
1152
}
1134
1153
}
1135
1154
0 commit comments