Skip to content

Commit 58b0ea9

Browse files
authored
Merge pull request #68500 from kubamracek/embedded-crash-on-existentialmetatypeinst
[embedded] Fix compiler crash in getRuntimeEffect when processing ExistentialMetatypeInst
2 parents 0797d66 + ae0ec1c commit 58b0ea9

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

lib/SIL/Utils/InstructionUtils.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -806,11 +806,21 @@ RuntimeEffect swift::getRuntimeEffect(SILInstruction *inst, SILType &impactType)
806806
case ExistentialRepresentation::Opaque:
807807
return RuntimeEffect::MetaData;
808808
case ExistentialRepresentation::Class: {
809+
if (opType.isAnyObject()) {
810+
if (inst->getModule().getASTContext().LangOpts.EnableObjCInterop) {
811+
return RuntimeEffect::MetaData | RuntimeEffect::Existential |
812+
RuntimeEffect::ObjectiveC;
813+
} else {
814+
return RuntimeEffect::MetaData | RuntimeEffect::Existential;
815+
}
816+
}
809817
auto *cl = opType.getClassOrBoundGenericClass();
810-
bool usesObjCModel = cl->getObjectModel() == ReferenceCounting::ObjC;
811-
if ((cl && usesObjCModel) || opType.isAnyObject())
812-
return RuntimeEffect::MetaData | RuntimeEffect::ObjectiveC;
813-
return RuntimeEffect::MetaData | RuntimeEffect::ObjectiveC;
818+
bool usesObjCModel =
819+
cl && cl->getObjectModel() == ReferenceCounting::ObjC;
820+
if (usesObjCModel)
821+
return RuntimeEffect::MetaData | RuntimeEffect::ObjectiveC |
822+
RuntimeEffect::Existential;
823+
return RuntimeEffect::MetaData | RuntimeEffect::Existential;
814824
}
815825
case ExistentialRepresentation::None:
816826
return RuntimeEffect::NoEffect;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// RUN: %target-swift-emit-ir -parse-stdlib %s -enable-experimental-feature Embedded -verify
2+
3+
public enum Never {}
4+
5+
@_silgen_name("abort")
6+
func abort() -> Never
7+
8+
@_semantics("typechecker.type(of:)")
9+
public func type<T, Metatype>(of value: T) -> Metatype { abort() }
10+
11+
public typealias AnyObject = Builtin.AnyObject
12+
13+
precedencegroup AssignmentPrecedence { assignment: true }
14+
15+
public func foo(_ x: AnyObject) {
16+
_ = type(of: x) // expected-error {{existential can cause metadata allocation or locks}}
17+
// expected-note@-1 {{called from here}}
18+
}

0 commit comments

Comments
 (0)