@@ -459,6 +459,15 @@ static bool validateCaseCodingKeysEnum(const DerivedConformance &derived,
459459 ? addImplicitCaseCodingKeys (
460460 enumDecl, elementDecl, codingKeysEnum)
461461 : caseCodingKeysDecls.front ();
462+
463+ if (!result) {
464+ // There is no coding key defined for this element,
465+ // which is okay, because not all elements have to
466+ // be considered for serialization. Attempts to
467+ // en-/decode them will be handled at runtime.
468+ return true ;
469+ }
470+
462471 auto *codingKeysTypeDecl = dyn_cast<TypeDecl>(result);
463472 if (!codingKeysTypeDecl) {
464473 result->diagnose (diag::codable_codingkeys_type_is_not_an_enum_here,
@@ -625,7 +634,7 @@ static ThrowStmt *createThrowCodingErrorStmt(ASTContext &C, Expr *containerExpr,
625634 assert (contextDecl && " Missing Context decl." );
626635
627636 auto *debugMessageExpr = new (C) StringLiteralExpr (
628- StringRef ( " Invalid number of keys found, expected one. " ), SourceRange (),
637+ C. AllocateCopy (debugMessage ), SourceRange (),
629638 /* Implicit */ true );
630639
631640 auto *contextTypeExpr =
@@ -1069,14 +1078,14 @@ deriveBodyEncodable_enum_encode(AbstractFunctionDecl *encodeDecl, void *) {
10691078 // This case should not be encodable, so throw an error if an attempt
10701079 // is made to encode it
10711080 auto debugMessage =
1072- " Case '" + elt->getBaseIdentifier ().str () +
1073- " ' cannot be decoded because it is not defined in CodingKeys." ;
1081+ " Case '" + elt->getBaseIdentifier ().str (). str () +
1082+ " ' cannot be encoded because it is not defined in CodingKeys." ;
10741083 auto *selfRefExpr = new (C) DeclRefExpr (
10751084 ConcreteDeclRef (selfRef), DeclNameLoc (), /* Implicit */ true );
10761085
10771086 auto *throwStmt = createThrowCodingErrorStmt (
10781087 C, containerExpr, C.getEncodingErrorDecl (), C.Id_invalidValue ,
1079- selfRefExpr, debugMessage. str () );
1088+ selfRefExpr, debugMessage);
10801089
10811090 caseStatements.push_back (throwStmt);
10821091 } else {
0 commit comments