Files
swift-mirror/validation-test/Evolution/test_keypaths.swift.gyb
Joe Groff 53e8e7b1d8 SILGen: Don't reference external property descriptors for @_alwaysEmitIntoClient properties.
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.
2022-06-01 16:54:38 -07:00

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()