mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Their definition is fully visible to clients to be copied into them, and there isn't necessarily a symbol for the property descriptor in the defining module, so it isn't necessary or desirable to try to use a property descriptor with them. Trying to reference the descriptor leads to missing symbol errors at load time when trying to use keypaths with older versions of the defining dylib, which goes against the purpose of `@_alwaysEmitIntoClient` meaning "no ABI liabilities for the defining module". Fixes rdar://94049160.
118 lines
2.4 KiB
Swift
118 lines
2.4 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %empty-directory(%t/Inputs)
|
|
// RUN: %empty-directory(%t/rth)
|
|
// RUN: env PYTHONPATH=%S/Inputs %gyb < %s > %t/test_keypaths.swift
|
|
// RUN: env PYTHONPATH=%S/Inputs %gyb < %S/Inputs/keypaths.swift.gyb > %t/Inputs/keypaths.swift
|
|
// RUN: %target-resilience-test --t "%t/rth" --S "%t" --s "%t/test_keypaths.swift" --no-symbol-diff
|
|
|
|
// REQUIRES: executable_test
|
|
|
|
import keypaths
|
|
import StdlibUnittest
|
|
|
|
%{
|
|
from keypaths_gyb import testCases
|
|
}%
|
|
|
|
var tests = TestSuite("key path resilience")
|
|
|
|
% for (name, kind, before, after, addsAPI) in testCases:
|
|
|
|
% if addsAPI:
|
|
#if BEFORE
|
|
% end
|
|
|
|
% if kind == "mutating" or kind == "nonmutating":
|
|
|
|
tests.test("AnEnum.${name}") {
|
|
let fromModule = AnEnum.keyPath_${name}
|
|
let formedLocally = \AnEnum.${name}
|
|
|
|
expectEqual(fromModule, formedLocally)
|
|
}
|
|
|
|
% elif kind == "stored":
|
|
|
|
% else:
|
|
%{ raise ValueError("improper test case kind") }%
|
|
% end
|
|
|
|
% if addsAPI:
|
|
#endif // BEFORE
|
|
% end
|
|
|
|
% end
|
|
|
|
% for (name, kind, before, after, addsAPI) in testCases:
|
|
|
|
% if addsAPI:
|
|
#if BEFORE
|
|
% end
|
|
|
|
% if kind == "mutating" or kind == "nonmutating" or kind == "stored":
|
|
|
|
tests.test("AStruct.${name}") {
|
|
let fromModule = AStruct.keyPath_${name}
|
|
let formedLocally = \AStruct.${name}
|
|
|
|
expectEqual(fromModule, formedLocally)
|
|
}
|
|
|
|
% else:
|
|
%{ raise ValueError("improper test case kind") }%
|
|
% end
|
|
|
|
% if addsAPI:
|
|
#endif // BEFORE
|
|
% end
|
|
|
|
% end
|
|
|
|
% for (name, kind, before, after, addsAPI) in testCases:
|
|
|
|
% if addsAPI:
|
|
#if BEFORE
|
|
% end
|
|
|
|
% if kind == "nonmutating" or kind == "stored":
|
|
|
|
tests.test("AClass.${name}") {
|
|
let fromModule = AClass.keyPath_${name}
|
|
let formedLocally = \AClass.${name}
|
|
|
|
expectEqual(fromModule, formedLocally)
|
|
}
|
|
|
|
tests.test("AFinalClass.${name}") {
|
|
let fromModule = AFinalClass.keyPath_${name}
|
|
let formedLocally = \AFinalClass.${name}
|
|
|
|
expectEqual(fromModule, formedLocally)
|
|
}
|
|
|
|
% elif kind == "mutating":
|
|
|
|
% else:
|
|
%{ raise ValueError("improper test case kind") }%
|
|
% end
|
|
|
|
% if addsAPI:
|
|
#endif
|
|
% end
|
|
|
|
% end
|
|
|
|
#if AFTER
|
|
tests.test("AlwaysEmitIntoClient") {
|
|
// AEIC declarations are vendored into their importing module, so
|
|
// equality doesn't currently work reliably with them. We can however
|
|
// test that the reference to the property works and is backward-compatible
|
|
// when using the `after` test suite with the `before` dylib.
|
|
let kp = \AEIC.aeic
|
|
|
|
expectEqual(kp, kp)
|
|
}
|
|
#endif
|
|
|
|
runAllTests()
|