@@ -826,6 +826,7 @@ createDesignatedInitOverride(ClassDecl *classDecl,
826
826
static void diagnoseMissingRequiredInitializer (
827
827
ClassDecl *classDecl,
828
828
ConstructorDecl *superInitializer,
829
+ bool downgradeToWarning,
829
830
ASTContext &ctx) {
830
831
// Find the location at which we should insert the new initializer.
831
832
SourceLoc insertionLoc;
@@ -906,6 +907,7 @@ static void diagnoseMissingRequiredInitializer(
906
907
ctx.Diags .diagnose (insertionLoc, diag::required_initializer_missing,
907
908
superInitializer->getName (),
908
909
superInitializer->getDeclContext ()->getDeclaredInterfaceType ())
910
+ .warnUntilSwiftVersionIf (downgradeToWarning, 6 )
909
911
.fixItInsert (insertionLoc, initializerText);
910
912
911
913
ctx.Diags .diagnose (findNonImplicitRequiredInit (superInitializer),
@@ -1172,10 +1174,11 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1172
1174
bool defaultInitable =
1173
1175
areAllStoredPropertiesDefaultInitializable (ctx.evaluator , decl);
1174
1176
1175
- // We can't define these overrides if we have any uninitialized
1176
- // stored properties.
1177
- if (!defaultInitable && !foundDesignatedInit)
1178
- return ;
1177
+ // In cases where we can't define any overrides, we used to suppress
1178
+ // diagnostics about missing required initializers. Now we emit diagnostics,
1179
+ // but downgrade them to warnings prior to Swift 6.
1180
+ bool downgradeRequiredInitsToWarning =
1181
+ !defaultInitable && !foundDesignatedInit;
1179
1182
1180
1183
SmallVector<ConstructorDecl *, 4 > nonOverriddenSuperclassCtors;
1181
1184
collectNonOveriddenSuperclassInits (decl, nonOverriddenSuperclassCtors);
@@ -1187,8 +1190,10 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1187
1190
if (superclassCtor->isRequired ()) {
1188
1191
assert (superclassCtor->isInheritable () &&
1189
1192
" factory initializers cannot be 'required'" );
1190
- if (!decl->inheritsSuperclassInitializers ())
1191
- diagnoseMissingRequiredInitializer (decl, superclassCtor, ctx);
1193
+ if (!decl->inheritsSuperclassInitializers ()) {
1194
+ diagnoseMissingRequiredInitializer (
1195
+ decl, superclassCtor, downgradeRequiredInitsToWarning, ctx);
1196
+ }
1192
1197
}
1193
1198
continue ;
1194
1199
}
@@ -1204,12 +1209,18 @@ static void addImplicitInheritedConstructorsToClass(ClassDecl *decl) {
1204
1209
1205
1210
// Diagnose a missing override of a required initializer.
1206
1211
if (superclassCtor->isRequired () && !inheritDesignatedInits) {
1207
- diagnoseMissingRequiredInitializer (decl, superclassCtor, ctx);
1212
+ diagnoseMissingRequiredInitializer (
1213
+ decl, superclassCtor, downgradeRequiredInitsToWarning, ctx);
1208
1214
continue ;
1209
1215
}
1210
1216
1211
1217
// A designated or required initializer has not been overridden.
1212
1218
1219
+ // We can't define any overrides if we have any uninitialized
1220
+ // stored properties.
1221
+ if (!defaultInitable && !foundDesignatedInit)
1222
+ continue ;
1223
+
1213
1224
bool alreadyDeclared = false ;
1214
1225
1215
1226
auto results = decl->lookupDirect (DeclBaseName::createConstructor ());
0 commit comments