Skip to content

Commit ab9608b

Browse files
committed
Sema: Fix enum case witness crash when 'var' requirement has no parsed setter
1 parent 3290833 commit ab9608b

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

lib/Sema/TypeCheckProtocol.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ swift::matchWitness(
658658
if (!cast<ValueDecl>(req)->isStatic())
659659
return RequirementMatch(witness, MatchKind::StaticNonStaticConflict);
660660
if (isa<VarDecl>(req) &&
661-
cast<VarDecl>(req)->getParsedAccessor(AccessorKind::Set))
661+
cast<VarDecl>(req)->isSettable(req->getDeclContext()))
662662
return RequirementMatch(witness, MatchKind::SettableConflict);
663663

664664
decomposeFunctionType = enumCase->hasAssociatedValues();

lib/Sema/TypeCheckStorage.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -3252,6 +3252,27 @@ StorageImplInfoRequest::evaluate(Evaluator &evaluator,
32523252
}
32533253
}
32543254

3255+
// Handle protocol requirements specially.
3256+
if (isa<ProtocolDecl>(storage->getDeclContext())) {
3257+
ReadImplKind readImpl = ReadImplKind::Stored;
3258+
// By default, treat the requirement as not having a setter.
3259+
WriteImplKind writeImpl = WriteImplKind::Immutable;
3260+
ReadWriteImplKind readWriteImpl = ReadWriteImplKind::Immutable;
3261+
3262+
if (storage->getParsedAccessor(AccessorKind::Set)) {
3263+
readImpl = ReadImplKind::Get;
3264+
writeImpl = WriteImplKind::Set;
3265+
readWriteImpl = ReadWriteImplKind::MaterializeToTemporary;
3266+
} else if (storage->getParsedAccessor(AccessorKind::Get)) {
3267+
readImpl = ReadImplKind::Get;
3268+
}
3269+
3270+
StorageImplInfo info(readImpl, writeImpl, readWriteImpl);
3271+
finishStorageImplInfo(storage, info);
3272+
3273+
return info;
3274+
}
3275+
32553276
bool hasWillSet = storage->getParsedAccessor(AccessorKind::WillSet);
32563277
bool hasDidSet = storage->getParsedAccessor(AccessorKind::DidSet);
32573278
bool hasSetter = storage->getParsedAccessor(AccessorKind::Set);

test/decl/protocol/protocol_enum_witness.swift

+7
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,10 @@ protocol ThrowingFactory {
139139
enum HorseFactory : ThrowingFactory {
140140
case horse(Int)
141141
}
142+
143+
protocol MissingAccessorsVar {
144+
static var bar: Self // expected-error {{property in protocol must have explicit { get } or { get set } specifier}}
145+
}
146+
enum Bar14: MissingAccessorsVar { // OK
147+
case bar
148+
}

0 commit comments

Comments
 (0)