From c4abca3df46d4cbb00b199e6fe977e208d3132aa Mon Sep 17 00:00:00 2001 From: John McCall Date: Wed, 25 Jul 2018 03:39:04 -0400 Subject: [PATCH] Add a test case for an unresolvable dynamic metadata cycle. --- .../Inputs/resilient_generic_struct_v1.swift | 6 +++ .../Inputs/resilient_generic_struct_v2.swift | 8 ++++ ...unresolvable_dynamic_metadata_cycles.swift | 47 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 test/Interpreter/Inputs/resilient_generic_struct_v1.swift create mode 100644 test/Interpreter/Inputs/resilient_generic_struct_v2.swift create mode 100644 test/Interpreter/unresolvable_dynamic_metadata_cycles.swift diff --git a/test/Interpreter/Inputs/resilient_generic_struct_v1.swift b/test/Interpreter/Inputs/resilient_generic_struct_v1.swift new file mode 100644 index 0000000000000..55a0dd5ec0244 --- /dev/null +++ b/test/Interpreter/Inputs/resilient_generic_struct_v1.swift @@ -0,0 +1,6 @@ +public struct ResilientGenericStruct { + public init(value: T) { + size = MemoryLayout.size + } + public var size: Int +} diff --git a/test/Interpreter/Inputs/resilient_generic_struct_v2.swift b/test/Interpreter/Inputs/resilient_generic_struct_v2.swift new file mode 100644 index 0000000000000..dcae19f4ef1a0 --- /dev/null +++ b/test/Interpreter/Inputs/resilient_generic_struct_v2.swift @@ -0,0 +1,8 @@ +public struct ResilientGenericStruct { + public init(value: T) { + size = MemoryLayout.size + storage = value + } + public var size: Int + private var storage: T +} diff --git a/test/Interpreter/unresolvable_dynamic_metadata_cycles.swift b/test/Interpreter/unresolvable_dynamic_metadata_cycles.swift new file mode 100644 index 0000000000000..56c69e02b6db6 --- /dev/null +++ b/test/Interpreter/unresolvable_dynamic_metadata_cycles.swift @@ -0,0 +1,47 @@ +// RUN: %empty-directory(%t) + +// RUN: %target-build-swift-dylib(%t/libresil.%target-dylib-extension) -Xfrontend -enable-resilience %S/Inputs/resilient_generic_struct_v1.swift -emit-module -emit-module-path %t/resil.swiftmodule -module-name resil +// RUN: %target-codesign %t/libresil.%target-dylib-extension + +// RUN: %target-build-swift %s -L %t -I %t -lresil -o %t/main -Xlinker -rpath -Xlinker %t + +// RUN: %target-build-swift-dylib(%t/libresil.%target-dylib-extension) -Xfrontend -enable-resilience %S/Inputs/resilient_generic_struct_v2.swift -emit-module -emit-module-path %t/resil.swiftmodule -module-name resil +// RUN: %target-codesign %t/libresil.%target-dylib-extension + +// RUN: %target-run %t/main %t/libresil.%target-dylib-extension + +import StdlibUnittest + +// We build this code against a version of 'resil' where +// ResilientGenericStruct doesn't store a T, then switch the +// dynamic library to a new version where it does, introducing +// an unresolvable dynamic cycle. +// +// It would also be sufficient to demonstrate this crash if the +// compiler *actually* didn't know about the internal implementation +// details of 'resil' when building this file, but since it currently +// still does, it'll report a cycle immediately if we don't pull +// this switcharoo. +import resil + +var DynamicMetadataCycleTests = + TestSuite("Unresolvable dynamic metadata cycle tests") + +enum test0_Node { + case link(ResilientGenericStruct) + + static func test() -> [test0_Node] { + return [] + } +} +DynamicMetadataCycleTests.test("cycle through enum") + .crashOutputMatches("runtime error: unresolvable type metadata dependency cycle detected") + .crashOutputMatches(" main.test0_Node") + .crashOutputMatches(" depends on layout of resil.ResilientGenericStruct