Skip to content

Commit ad519b9

Browse files
authored
Merge pull request swiftlang#38210 from drexin/wip-fix-codable-enum
[Sema] Properly handle missing coding keys in enum Codable synthesis
2 parents ff7fdc5 + 7841f86 commit ad519b9

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

lib/Sema/DerivedConformanceCodable.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
enum EnumWithExcludedElement : Codable {
4+
case x
5+
case y
6+
7+
enum CodingKeys: CodingKey {
8+
case x
9+
}
10+
}

0 commit comments

Comments
 (0)