blob: ff7a8d3f747e91d3605ebdde34b35ddca81121eb [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -module-name test -num-threads 1 -O -c -g %S/Inputs/resilient-witness-2.swift %s -o %t/resilient-witness-2.o -o %t/resilient-witness.o
// RUN: %target-swift-frontend -module-name test -num-threads 1 -O -emit-ir -g %S/Inputs/resilient-witness-2.swift %s -o %t/resilient-witness-2.ll -o %t/resilient-witness.ll
// RUN: %FileCheck %s < %t/resilient-witness.ll
// We used to crash on this test case during code generation because the
// resilient witness table and the witness of the equatable conformance was
// emitted into different files. Because the witness is expressed as a relative
// pointer this was problematic.
class Context {
enum SomeEnum: Int {
case One = 1
case MinusOne = -1
init?(_ delimiter: Character) {
switch delimiter {
case "1":
self = .One
case "-":
self = .MinusOne
default:
return nil
}
}
}
private struct SomeEnumStruct {
var e: SomeEnum?
}
private var arr: [SomeEnumStruct?] = []
}
public func inlineThis(_ char: Character) {
if Context.SomeEnum(char) == .MinusOne {
print("foobar")
}
}
// The witness table and witness definition need to be in the same file.
// CHECK: @"$S4test7ContextC8SomeEnumOs9EquatableAAWr" = {{.*}}sub {{.*}} @"$S4test7ContextC8SomeEnumOs9EquatableAAsAFP2eeoiySbx_xtFZTW" {{.*}} @"$S4test7ContextC8SomeEnumOs9EquatableAAWr"
// CHECK: define{{.*}}@"$S4test7ContextC8SomeEnumOs9EquatableAAsAFP2eeoiySbx_xtFZTW"({{.*}}){{.*}} {
// CHECK-NEXT: entry: