SILGen: Emit property descriptors for conditionally Copyable and Escapable types.

Key paths can't reference non-escapable or non-copyable storage declarations,
so we don't need to refer to them resiliently, and can elide their property
descriptors.

However, declarations may still be conditionally Copyable and Escapable, and
if so, then they still need a property descriptor for resilient key path
references. When a property or subscript can be used in a context where it
is fully Copyable and Escapable, emit the property descriptor in a generic
environment constrained by the necessary conditional constraints.

Fixes rdar://151628396.
This commit is contained in:
Joe Groff
2025-05-19 12:30:17 -07:00
parent 7387f85ba2
commit 22eb7e62d9
12 changed files with 406 additions and 179 deletions

View File

@@ -6276,9 +6276,12 @@ public:
/// Otherwise, its override must be referenced.
bool isValidKeyPathComponent() const;
/// True if the storage exports a property descriptor for key paths in
/// other modules.
bool exportsPropertyDescriptor() const;
/// If the storage exports a property descriptor for key paths in other
/// modules, this returns the generic signature in which its member methods
/// are emitted. If the storage does not export a property descriptor,
/// returns `std::nullopt`.
std::optional<GenericSignature>
getPropertyDescriptorGenericSignature() const;
/// True if any of the accessors to the storage is private or fileprivate.
bool hasPrivateAccessor() const;

View File

@@ -617,6 +617,23 @@ using GenericSignatureErrors = OptionSet<GenericSignatureErrorFlags>;
using GenericSignatureWithError = llvm::PointerIntPair<GenericSignature, 3,
GenericSignatureErrors>;
/// Build a generic signature from the given requirements, which are not
/// required to be minimal or canonical, and may contain unresolved
/// DependentMemberTypes. The generic signature is returned with the
/// error flags (if any) that were raised while building the signature.
///
/// \param baseSignature if non-null, the new parameters and requirements
///// are added on; existing requirements of the base signature might become
///// redundant. Otherwise if null, build a new signature from scratch.
/// \param allowInverses if true, default requirements to Copyable/Escapable are
/// expanded for generic parameters.
GenericSignatureWithError buildGenericSignatureWithError(
ASTContext &ctx,
GenericSignature baseSignature,
SmallVector<GenericTypeParamType *, 2> addedParameters,
SmallVector<Requirement, 2> addedRequirements,
bool allowInverses);
} // end namespace swift
namespace llvm {

View File

@@ -1043,7 +1043,7 @@ public:
}
static LinkEntity forPropertyDescriptor(AbstractStorageDecl *decl) {
assert(decl->exportsPropertyDescriptor());
assert((bool)decl->getPropertyDescriptorGenericSignature());
LinkEntity entity;
entity.setForDecl(Kind::PropertyDescriptor, decl);
return entity;

View File

@@ -749,7 +749,8 @@ Type BuildForwardingSubstitutions::operator()(SubstitutableType *type) const {
return Type();
}
SubstitutionMap GenericEnvironment::getForwardingSubstitutionMap() const {
SubstitutionMap
GenericEnvironment::getForwardingSubstitutionMap() const {
auto genericSig = getGenericSignature();
return SubstitutionMap::get(genericSig,
BuildForwardingSubstitutions(this),

View File

@@ -1179,15 +1179,11 @@ void swift::validateGenericSignature(ASTContext &context,
{
PrettyStackTraceGenericSignature debugStack("verifying", sig);
auto newSigWithError = evaluateOrDefault(
context.evaluator,
AbstractGenericSignatureRequest{
nullptr,
genericParams,
requirements,
/*allowInverses=*/false},
GenericSignatureWithError());
auto newSigWithError = buildGenericSignatureWithError(context,
GenericSignature(),
genericParams,
requirements,
/*allowInverses*/ false);
// If there were any errors, the signature was invalid.
auto errorFlags = newSigWithError.getInt();
if (errorFlags.contains(GenericSignatureErrorFlags::HasInvalidRequirements) ||
@@ -1307,8 +1303,8 @@ void swift::validateGenericSignaturesInModule(ModuleDecl *module) {
}
}
GenericSignature
swift::buildGenericSignature(ASTContext &ctx,
GenericSignatureWithError
swift::buildGenericSignatureWithError(ASTContext &ctx,
GenericSignature baseSignature,
SmallVector<GenericTypeParamType *, 2> addedParameters,
SmallVector<Requirement, 2> addedRequirements,
@@ -1320,7 +1316,18 @@ swift::buildGenericSignature(ASTContext &ctx,
addedParameters,
addedRequirements,
allowInverses},
GenericSignatureWithError()).getPointer();
GenericSignatureWithError());
}
GenericSignature
swift::buildGenericSignature(ASTContext &ctx,
GenericSignature baseSignature,
SmallVector<GenericTypeParamType *, 2> addedParameters,
SmallVector<Requirement, 2> addedRequirements,
bool allowInverses) {
return buildGenericSignatureWithError(ctx, baseSignature,
addedParameters, addedRequirements,
allowInverses).getPointer();
}
GenericSignature GenericSignature::withoutMarkerProtocols() const {

View File

@@ -18,6 +18,7 @@
#include "swift/SIL/SILUndef.h"
#include "swift/AST/ASTContext.h"
#include "swift/AST/AnyFunctionRef.h"
#include "swift/AST/ConformanceLookup.h"
#include "swift/AST/Decl.h"
#include "swift/AST/GenericEnvironment.h"
#include "swift/AST/Pattern.h"
@@ -307,18 +308,106 @@ bool SILModule::isTypeMetadataForLayoutAccessible(SILType type) {
return ::isTypeMetadataForLayoutAccessible(*this, type);
}
static bool isUnsupportedKeyPathValueType(Type ty) {
// Given the type `ty`, which should be in the generic environment of the signature
// `sig`, return a generic signature with all of the requirements of `sig`,
// combined with all of the requirements necessary for `ty` to be both
// `Copyable` and `Escapable`, if possible. Returns `nullopt` if the type
// can never be both Copyable and Escapable.
static std::optional<GenericSignature>
getKeyPathSupportingGenericSignature(Type ty, GenericSignature contextSig) {
auto &C = ty->getASTContext();
// If the type is already unconditionally Copyable and Escapable, we don't
// need any further requirements.
if (!ty->isNoncopyable() && ty->isEscapable()) {
return contextSig;
}
ProtocolConformanceRef copyable, escapable;
auto copyableProtocol = C.getProtocol(KnownProtocolKind::Copyable);
auto escapableProtocol = C.getProtocol(KnownProtocolKind::Escapable);
// If the type is an archetype, then it just needs Copyable and Escapable
// constraints imposed.
if (ty->is<ArchetypeType>()) {
copyable = ProtocolConformanceRef::forAbstract(ty->mapTypeOutOfContext(),
copyableProtocol);
escapable = ProtocolConformanceRef::forAbstract(ty->mapTypeOutOfContext(),
escapableProtocol);
} else {
// Look for any conditional conformances.
copyable = lookupConformance(ty, copyableProtocol);
escapable = lookupConformance(ty, escapableProtocol);
}
// If the type is never copyable or escapable, that's it.
if (copyable.isInvalid() || escapable.isInvalid()) {
return std::nullopt;
}
// Otherwise, let's see if we get a viable generic signature combining the
// requirements for those conformances with the requirements of the
// declaration context.
SmallVector<Requirement, 2> ceRequirements;
auto getRequirementsFromConformance = [&](ProtocolConformanceRef ref) {
if (ref.isAbstract()) {
// The only requirements are that the abstract type itself be copyable
// and escapable.
ceRequirements.push_back(Requirement(RequirementKind::Conformance,
ty->mapTypeOutOfContext(), copyableProtocol->getDeclaredType()));
ceRequirements.push_back(Requirement(RequirementKind::Conformance,
ty->mapTypeOutOfContext(), escapableProtocol->getDeclaredType()));
return;
}
if (!ref.isConcrete()) {
return;
}
auto conformance = ref.getConcrete();
for (auto reqt : conformance->getRootConformance()
->getConditionalRequirements()) {
ceRequirements.push_back(reqt);
}
};
getRequirementsFromConformance(copyable);
getRequirementsFromConformance(escapable);
auto regularSignature = buildGenericSignatureWithError(C,
contextSig,
{},
std::move(ceRequirements),
/*allowInverses*/ false);
// If the resulting signature has conflicting requirements, then it is
// impossible for the type to be copyable and equatable.
if (regularSignature.getInt()) {
return std::nullopt;
}
// Otherwise, we have the signature we're looking for.
return regularSignature.getPointer();
}
static std::optional<GenericSignature>
getKeyPathSupportingGenericSignatureForValueType(Type ty,
GenericSignature sig) {
std::optional<GenericSignature> contextSig = sig;
// Visit lowered positions.
if (auto tupleTy = ty->getAs<TupleType>()) {
for (auto eltTy : tupleTy->getElementTypes()) {
if (eltTy->is<PackExpansionType>())
return true;
return std::nullopt;
if (isUnsupportedKeyPathValueType(eltTy))
return true;
contextSig = getKeyPathSupportingGenericSignatureForValueType(
eltTy, *contextSig);
if (!contextSig)
return std::nullopt;
}
return false;
return contextSig;
}
if (auto objTy = ty->getOptionalObjectType())
@@ -330,66 +419,78 @@ static bool isUnsupportedKeyPathValueType(Type ty) {
for (auto param : funcTy->getParams()) {
auto paramTy = param.getPlainType();
if (paramTy->is<PackExpansionType>())
return true;
return std::nullopt;
if (isUnsupportedKeyPathValueType(paramTy))
return true;
contextSig = getKeyPathSupportingGenericSignatureForValueType(paramTy,
*contextSig);
if (!contextSig) {
return std::nullopt;
}
}
if (isUnsupportedKeyPathValueType(funcTy->getResult()))
return true;
contextSig = getKeyPathSupportingGenericSignatureForValueType(funcTy->getResult(),
*contextSig);
if (!contextSig) {
return std::nullopt;
}
}
// Noncopyable types aren't supported by key paths in their current form.
// They would also need a new ABI that's yet to be implemented in order to
// be properly supported, so let's suppress the descriptor for now if either
// the container or storage type of the declaration is non-copyable.
if (ty->isNoncopyable())
return true;
return false;
return getKeyPathSupportingGenericSignature(ty, *contextSig);
}
bool AbstractStorageDecl::exportsPropertyDescriptor() const {
std::optional<GenericSignature>
AbstractStorageDecl::getPropertyDescriptorGenericSignature() const {
// The storage needs a descriptor if it sits at a module's ABI boundary,
// meaning it has public linkage.
// meaning it has public linkage, and it is eligible to be part of a key path.
if (!isStatic()) {
if (auto contextTy = getDeclContext()->getDeclaredTypeInContext()) {
if (contextTy->isNoncopyable()) {
return false;
}
auto contextTy = getDeclContext()->getDeclaredTypeInContext();
auto contextSig = getInnermostDeclContext()->getGenericSignatureOfContext();
// If the root type is never `Copyable` or `Escapable`, then instance
// members can't be used in key paths, at least as they are implemented
// today.
if (!isStatic() && contextTy) {
auto ceContextSig = getKeyPathSupportingGenericSignature(contextTy,
contextSig);
if (!ceContextSig) {
return std::nullopt;
}
contextSig = *ceContextSig;
}
// TODO: Global properties ought to eventually be referenceable
// as key paths from ().
if (!getDeclContext()->isTypeContext())
return false;
return std::nullopt;
// Protocol requirements do not need property descriptors.
if (isa<ProtocolDecl>(getDeclContext()))
return false;
return std::nullopt;
// Static properties declared directly in protocol do not need
// descriptors as existential Any.Type will not resolve to a value.
if (isStatic() && isa<ProtocolDecl>(getDeclContext()))
return false;
return std::nullopt;
// FIXME: We should support properties and subscripts with '_read' accessors;
// 'get' is not part of the opaque accessor set there.
auto *getter = getOpaqueAccessor(AccessorKind::Get);
if (!getter)
return false;
return std::nullopt;
// If the getter is mutating, we cannot form a keypath to it at all.
if (isGetterMutating())
return false;
return std::nullopt;
// If the storage is an ABI-compatible override of another declaration, we're
// not going to be emitting a property descriptor either.
if (!isValidKeyPathComponent())
return false;
return std::nullopt;
// TODO: If previous versions of an ABI-stable binary needed the descriptor,
// then we still do.
@@ -409,7 +510,7 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const {
case SILLinkage::Private:
case SILLinkage::Hidden:
// Don't need a public descriptor.
return false;
return std::nullopt;
case SILLinkage::HiddenExternal:
case SILLinkage::PublicExternal:
@@ -417,19 +518,22 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const {
llvm_unreachable("should be definition linkage?");
}
auto typeInContext = getInnermostDeclContext()->mapTypeIntoContext(
auto typeInContext = contextSig.getGenericEnvironment()->mapTypeIntoContext(
getValueInterfaceType());
if (isUnsupportedKeyPathValueType(typeInContext)) {
return false;
auto valueTypeSig = getKeyPathSupportingGenericSignatureForValueType(typeInContext, contextSig);
if (!valueTypeSig) {
return std::nullopt;
}
contextSig = *valueTypeSig;
// Subscripts with inout arguments (FIXME)and reabstracted arguments(/FIXME)
// don't have descriptors either.
if (auto sub = dyn_cast<SubscriptDecl>(this)) {
for (auto *index : *sub->getIndices()) {
// Keypaths can't capture inout indices.
if (index->isInOut())
return false;
if (index->isInOut()) {
return std::nullopt;
}
auto indexTy = index->getInterfaceType()
->getReducedType(sub->getGenericSignatureOfContext());
@@ -439,7 +543,7 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const {
// had only one abstraction level and no explosion.
if (isa<TupleType>(indexTy))
return false;
return std::nullopt;
auto indexObjTy = indexTy;
if (auto objTy = indexObjTy.getOptionalObjectType())
@@ -447,9 +551,9 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const {
if (isa<AnyFunctionType>(indexObjTy)
|| isa<AnyMetatypeType>(indexObjTy))
return false;
return std::nullopt;
}
}
return true;
return contextSig;
}

View File

@@ -569,7 +569,7 @@ public:
void visitAbstractStorageDecl(AbstractStorageDecl *ASD) {
// Add the property descriptor if the decl needs it.
if (ASD->exportsPropertyDescriptor()) {
if (ASD->getPropertyDescriptorGenericSignature()) {
Visitor.addPropertyDescriptor(ASD);
}

View File

@@ -2075,17 +2075,16 @@ void SILGenModule::tryEmitPropertyDescriptor(AbstractStorageDecl *decl) {
if (!SILModuleConventions(M).useLoweredAddresses())
return;
if (!decl->exportsPropertyDescriptor())
auto descriptorContext = decl->getPropertyDescriptorGenericSignature();
if (!descriptorContext)
return;
PrettyStackTraceDecl stackTrace("emitting property descriptor for", decl);
Type baseTy;
if (decl->getDeclContext()->isTypeContext()) {
baseTy = decl->getDeclContext()->getSelfInterfaceType()
->getReducedType(decl->getInnermostDeclContext()
->getGenericSignatureOfContext());
->getReducedType(*descriptorContext);
if (decl->isStatic()) {
baseTy = MetatypeType::get(baseTy);
@@ -2096,8 +2095,7 @@ void SILGenModule::tryEmitPropertyDescriptor(AbstractStorageDecl *decl) {
llvm_unreachable("should not export a property descriptor yet");
}
auto genericEnv = decl->getInnermostDeclContext()
->getGenericEnvironmentOfContext();
auto genericEnv = descriptorContext->getGenericEnvironment();
unsigned baseOperand = 0;
bool needsGenericContext = true;
@@ -2107,8 +2105,16 @@ void SILGenModule::tryEmitPropertyDescriptor(AbstractStorageDecl *decl) {
}
SubstitutionMap subs;
if (genericEnv)
subs = genericEnv->getForwardingSubstitutionMap();
if (genericEnv) {
// The substitutions are used when invoking the underlying accessors, so
// we get these from the original declaration generic environment, even if
// `getPropertyDescriptorGenericSignature` computed a different generic
// environment, since the accessors will not need the extra Copyable or
// Escapable requirements.
subs = SubstitutionMap::get(decl->getInnermostDeclContext()
->getGenericSignatureOfContext(),
genericEnv->getForwardingSubstitutionMap());
}
auto component = emitKeyPathComponentForDecl(SILLocation(decl),
genericEnv,

View File

@@ -0,0 +1,180 @@
// RUN: %target-swift-emit-silgen -enable-library-evolution %s | %FileCheck %s
public struct ConditionallyCopyable<T: ~Copyable>: ~Copyable {
}
extension ConditionallyCopyable: Copyable where T: Copyable {}
public struct NeverCopyable: ~Copyable {}
public struct Index<U: ~Copyable>: Hashable { }
extension ConditionallyCopyable where T: ~Copyable {
// CHECK-LABEL: sil_property #ConditionallyCopyable.sometimesCopyableBase_sometimesCopyableValue
// CHECK-SAME: getter @{{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0> (@in_guaranteed ConditionallyCopyable<τ_0_0>) -> @out τ_0_0
// CHECK-SAME: setter @{{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed τ_0_0, @inout ConditionallyCopyable<τ_0_0>) -> ()
public private(set) var sometimesCopyableBase_sometimesCopyableValue: T {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.sometimesCopyableBase_alwaysCopyableValue
// CHECK-SAME: getter @{{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0> (@in_guaranteed ConditionallyCopyable<τ_0_0>) -> @out Int
// CHECK-SAME: setter @{{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed Int, @inout ConditionallyCopyable<τ_0_0>) -> ()
public private(set) var sometimesCopyableBase_alwaysCopyableValue: Int {
get { }
set { }
}
// CHECK-NOT: sil_property #ConditionallyCopyable.neverCopyableBase_alwaysCopyableValue
public private(set) var sometimesCopyableBase_neverCopyableValue: NeverCopyable {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.subscript{{.*}}, id @$s45conditionally_copyable_conformance_descriptor21ConditionallyCopyableVAARi_zrlE09sometimesf5Base_gF10IndexValueqd__AA0I0Vyqd__G_tcRi_d__luir
// CHECK-SAME: getter @{{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0><τ_1_0> (@in_guaranteed ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> @out τ_1_0
// CHECK-SAME: setter @{{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0><τ_1_0> (@in_guaranteed τ_1_0, @inout ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> ()
public private(set) subscript<U: ~Copyable>(
sometimesCopyableBase_sometimesCopyableIndexValue _: Index<U>
) -> U {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.subscript{{.*}}, id @$s45conditionally_copyable_conformance_descriptor21ConditionallyCopyableVAARi_zrlE09sometimesf5Base_gF5ValuexAA5IndexVyqd__G_tcRi_d__luir
// CHECK-SAME: getter @{{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> @out τ_0_0
// CHECK-SAME: setter @{{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed τ_0_0, @inout ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> ()
public private(set) subscript<U: ~Copyable>(
sometimesCopyableBase_sometimesCopyableValue _: Index<U>
) -> T {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.subscript{{.*}}, id @$s45conditionally_copyable_conformance_descriptor21ConditionallyCopyableVAARi_zrlE09sometimesf11Base_alwaysF5ValueSiAA5IndexVyqd__G_tcRi_d__luig
// CHECK-SAME: getter @{{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> @out Int
// CHECK-SAME: setter @{{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed Int, @inout ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> ()
public private(set) subscript<U: ~Copyable>(
sometimesCopyableBase_alwaysCopyableValue _: Index<U>
) -> Int {
get { }
set { }
}
// CHECK-NOT: sil_property #ConditionallyCopyable.subscript{{.*}}never
public private(set) subscript<U: ~Copyable>(
sometimesCopyableBase_neverCopyableValue _: Index<U>
) -> NeverCopyable {
get { }
set { }
}
}
extension ConditionallyCopyable where T == NeverCopyable, T: ~Copyable {
// CHECK-NOT: sil_property #ConditionallyCopyable.neverCopyableBase_sometimesCopyableValue
public private(set) var neverCopyableBase_sometimesCopyableValue: T {
get { }
set { }
}
// CHECK-NOT: sil_property #ConditionallyCopyable.neverCopyableBase_alwaysCopyableValue
public private(set) var neverCopyableBase_alwaysCopyableValue: Int {
get { }
set { }
}
// CHECK-NOT: sil_property #ConditionallyCopyable.neverCopyableBase_neverCopyableValue
public private(set) var neverCopyableBase_neverCopyableValue: NeverCopyable {
get { }
set { }
}
// CHECK-NOT: sil_property #ConditionallyCopyable.subscript{{.*}}never
public private(set) subscript<U: ~Copyable>(
neverCopyableBase_sometimesCopyableIndexValue _: Index<U>
) -> U {
get { }
set { }
}
public private(set) subscript<U: ~Copyable>(
neverCopyableBase_sometimesCopyableValue _: Index<U>
) -> T {
get { }
set { }
}
public private(set) subscript<U: ~Copyable>(
neverCopyableBase_alwaysCopyableValue _: Index<U>
) -> Int {
get { }
set { }
}
public private(set) subscript<U: ~Copyable>(
neverCopyableBase_neverCopyableValue _: Index<U>
) -> NeverCopyable {
get { }
set { }
}
}
extension ConditionallyCopyable where T: Copyable {
// CHECK-LABEL: sil_property #ConditionallyCopyable.alwaysCopyableBase_sometimesCopyableValue
// CHECK-SAME: getter {{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0> (@in_guaranteed ConditionallyCopyable<τ_0_0>) -> @out τ_0_0
// CHECK-SAME: setter {{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed τ_0_0, @inout ConditionallyCopyable<τ_0_0>) -> ()
public private(set) var alwaysCopyableBase_sometimesCopyableValue: T {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.alwaysCopyableBase_alwaysCopyableValue
// CHECK-SAME: getter {{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0> (@in_guaranteed ConditionallyCopyable<τ_0_0>) -> @out Int
// CHECK-SAME: setter {{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed Int, @inout ConditionallyCopyable<τ_0_0>) -> ()
public private(set) var alwaysCopyableBase_alwaysCopyableValue: Int {
get { }
set { }
}
// CHECK-NOT: sil_property alwaysCopyableBase_neverCopyableValue
public private(set) var alwaysCopyableBase_neverCopyableValue: NeverCopyable {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.subscript{{.*}}, id @$s45conditionally_copyable_conformance_descriptor21ConditionallyCopyableV06alwaysf14Base_sometimesF10IndexValueqd__AA0J0Vyqd__G_tcRi_d__luir
// CHECK-SAME: getter {{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0><τ_1_0> (@in_guaranteed ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> @out τ_1_0
// CHECK-SAME: setter {{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0><τ_1_0> (@in_guaranteed τ_1_0, @inout ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> ())
public private(set) subscript<U: ~Copyable>(
alwaysCopyableBase_sometimesCopyableIndexValue _: Index<U>
) -> U {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.subscript{{.*}}, id @$s45conditionally_copyable_conformance_descriptor21ConditionallyCopyableV06alwaysf14Base_sometimesF5ValuexAA5IndexVyqd__G_tcRi_d__luig
// CHECK-SAME: getter {{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> @out τ_0_0
// CHECK-SAME: setter {{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed τ_0_0, @inout ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> ()
public private(set) subscript<U: ~Copyable>(
alwaysCopyableBase_sometimesCopyableValue _: Index<U>
) -> T {
get { }
set { }
}
// CHECK-LABEL: sil_property #ConditionallyCopyable.subscript{{.*}}, id @$s45conditionally_copyable_conformance_descriptor21ConditionallyCopyableV06alwaysf5Base_gF5ValueSiAA5IndexVyqd__G_tcRi_d__luig
// CHECK-SAME: getter {{[^ ]*}} : $@convention(keypath_accessor_getter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> @out Int
// CHECK-SAME: setter {{[^ ]*}} : $@convention(keypath_accessor_setter) <τ_0_0><τ_1_0 where τ_1_0 : ~Copyable> (@in_guaranteed Int, @inout ConditionallyCopyable<τ_0_0>, @in_guaranteed Index<τ_1_0>) -> ()
public private(set) subscript<U: ~Copyable>(
alwaysCopyableBase_alwaysCopyableValue _: Index<U>
) -> Int {
get { }
set { }
}
// CHECK-NOT: sil_property #ConditionallyCopyable.subscript{{.*}}never
public private(set) subscript<U: ~Copyable>(
alwaysCopyableBase_neverCopyableValue _: Index<U>
) -> NeverCopyable {
get { }
set { }
}
}

View File

@@ -29,16 +29,8 @@ public struct NEImmortal: ~Escapable {
class C {}
// Test diagnostics on keypath getter.
//
// rdar://150073405 ([SILGen] support synthesized _modify on top of borrowed getters with library evolution)
//
// This produces the error:
// <unknown>:0: error: unexpected error produced: lifetime-dependent value returned by generated thunk
// '$s4test17ImplicitAccessorsV10neComputedAA10NEImmortalVvpACTK'
//
// Since this error has no source file, we can't verify the diagnostic!
/*
// Test that we don't implicitly try to create a keypath getter, since
// ~Escapable types are not yet supported by keypaths.
public struct ImplicitAccessors {
let c: C
@@ -50,7 +42,6 @@ public struct ImplicitAccessors {
}
}
}
*/
public struct NoncopyableImplicitAccessors : ~Copyable & ~Escapable {
public var ne: NE

View File

@@ -796,21 +796,9 @@ Added: _$sSS5IndexVs28CustomDebugStringConvertiblesWP
Added: _$ss4SpanVMa
Added: _$ss4SpanVMn
Added: _$ss4SpanVsRi_zrlE6_countSivg
Added: _$ss4SpanVsRi_zrlE6_countSivpMV
Added: _$ss4SpanVsRi_zrlE8_pointerSVSgvg
Added: _$ss4SpanVsRi_zrlE8_pointerSVSgvpMV
Added: _$ss4SpanVsRi_zrlE5countSivpMV
Added: _$ss4SpanVsRi_zrlE7indicesSnySiGvpMV
Added: _$ss4SpanVsRi_zrlE7isEmptySbvpMV
Added: _$ss4SpanVss15BitwiseCopyableRzlE9uncheckedxSi_tcipMV
Added: _$ss4SpanVss15BitwiseCopyableRzlEyxSicipMV
Added: _$ss7RawSpanV11byteOffsetsSnySiGvpMV
Added: _$ss7RawSpanV6_countSivg
Added: _$ss7RawSpanV6_countSivpMV
Added: _$ss7RawSpanV7isEmptySbvpMV
Added: _$ss7RawSpanV8_pointerSVSgvg
Added: _$ss7RawSpanV8_pointerSVSgvpMV
Added: _$ss7RawSpanV9byteCountSivpMV
Added: _$ss7RawSpanVMa
Added: _$ss7RawSpanVMn
Added: _$ss7RawSpanVN
@@ -818,9 +806,7 @@ Added: _$ss7RawSpanVN
// SE-0464 UTF8Span
Added: _$sSS7copyingSSs8UTF8SpanV_tcfC
Added: _$sSS8utf8Spans04UTF8B0Vvg
Added: _$sSS8utf8Spans04UTF8B0VvpMV
Added: _$sSs8utf8Spans04UTF8B0Vvg
Added: _$sSs8utf8Spans04UTF8B0VvpMV
Added: _$ss7UnicodeO4UTF8O15ValidationErrorV11byteOffsetsSnySiGvM
Added: _$ss7UnicodeO4UTF8O15ValidationErrorV11byteOffsetsSnySiGvg
Added: _$ss7UnicodeO4UTF8O15ValidationErrorV11byteOffsetsSnySiGvpMV
@@ -873,21 +859,15 @@ Added: _$ss7UnicodeO4UTF8O15ValidationErrorVs23CustomStringConvertiblesMc
Added: _$ss7UnicodeO4UTF8O15ValidationErrorVs23CustomStringConvertiblesWP
Added: _$ss7UnicodeO4UTF8O15_checkAllErrorsySayAD15ValidationErrorVGxSTRzs5UInt8V7ElementRtzlFZ
Added: _$ss8UTF8SpanV9unchecked12isKnownASCIIABs0B0Vys5UInt8VG_SbtcfC
Added: _$ss8UTF8SpanV10_countMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV10_flagsMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV10isKnownNFCSbvpMV
Added: _$ss8UTF8SpanV10validatingABs0B0Vys5UInt8VG_ts7UnicodeO0A0O15ValidationErrorVYKcfC
Added: _$ss8UTF8SpanV11checkForNFC10quickCheckS2b_tF
Added: _$ss8UTF8SpanV12isKnownASCIISbvpMV
Added: _$ss8UTF8SpanV13checkForASCIISbyF
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64VvM
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64Vvg
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64VvpMV
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64Vvs
Added: _$ss8UTF8SpanV17CharacterIteratorV11skipForward2byS2i_tF
Added: _$ss8UTF8SpanV17CharacterIteratorV11skipForwardSiyF
Added: _$ss8UTF8SpanV17CharacterIteratorV21currentCodeUnitOffsetSivg
Added: _$ss8UTF8SpanV17CharacterIteratorV21currentCodeUnitOffsetSivpMV
Added: _$ss8UTF8SpanV17CharacterIteratorV4nextSJSgyF
Added: _$ss8UTF8SpanV17CharacterIteratorV5reset20roundingForwardsFromySi_tF
Added: _$ss8UTF8SpanV17CharacterIteratorV5reset21roundingBackwardsFromySi_tF
@@ -898,19 +878,16 @@ Added: _$ss8UTF8SpanV17CharacterIteratorV8previousSJSgyF
Added: _$ss8UTF8SpanV17CharacterIteratorV8skipBack2byS2i_tF
Added: _$ss8UTF8SpanV17CharacterIteratorV8skipBackSiyF
Added: _$ss8UTF8SpanV17CharacterIteratorV9codeUnitsABvg
Added: _$ss8UTF8SpanV17CharacterIteratorV9codeUnitsABvpMV
Added: _$ss8UTF8SpanV17CharacterIteratorVMa
Added: _$ss8UTF8SpanV17CharacterIteratorVMn
Added: _$ss8UTF8SpanV17CharacterIteratorVN
Added: _$ss8UTF8SpanV17CharacterIteratorVyAdBcfC
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvM
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvg
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvpMV
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvs
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV11skipForward2byS2i_tF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV11skipForwardSiyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV21currentCodeUnitOffsetSivg
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV21currentCodeUnitOffsetSivpMV
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV4nexts0C0O0D0VSgyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV5reset20roundingForwardsFromySi_tF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV5reset21roundingBackwardsFromySi_tF
@@ -921,7 +898,6 @@ Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV8previouss0C0O0D0VSgyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV8skipBack2byS2i_tF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV8skipBackSiyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV9codeUnitsABvg
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV9codeUnitsABvpMV
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorVMa
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorVMn
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorVN
@@ -931,12 +907,7 @@ Added: _$ss8UTF8SpanV21makeCharacterIteratorAB0dE0VyF
Added: _$ss8UTF8SpanV23isCanonicallyEquivalent2toSbAB_tF
Added: _$ss8UTF8SpanV25makeUnicodeScalarIteratorAB0deF0VyF
Added: _$ss8UTF8SpanV4spans0B0Vys5UInt8VGvg
Added: _$ss8UTF8SpanV4spans0B0Vys5UInt8VGvpMV
Added: _$ss8UTF8SpanV5countSivpMV
Added: _$ss8UTF8SpanV7_nfcBits6UInt64VvpZMV
Added: _$ss8UTF8SpanV7isEmptySbvg
Added: _$ss8UTF8SpanV7isEmptySbvpMV
Added: _$ss8UTF8SpanV9_asciiBits6UInt64VvpZMV
Added: _$ss8UTF8SpanVMa
Added: _$ss8UTF8SpanVMn
Added: _$ss8UTF8SpanVN
@@ -955,20 +926,8 @@ Added: _$ss14MutableRawSpanVMn
Added: _$ss14MutableRawSpanVN
// SE-0456 Span-providing properties
Added: _$sSRsRi_zrlE4spans4SpanVyxGvpMV
Added: _$sSW5bytess7RawSpanVvpMV
Added: _$sSa4spans4SpanVyxGvpMV
Added: _$sSrsRi_zrlE4spans4SpanVyxGvpMV
Added: _$sSw5bytess7RawSpanVvpMV
Added: _$ss10ArraySliceV4spans4SpanVyxGvpMV
Added: _$ss13KeyValuePairsV4spans4SpanVyx3key_q_5valuetGvpMV
Added: _$ss15CollectionOfOneV4spans4SpanVyxGvpMV
Added: _$ss15ContiguousArrayV4spans4SpanVyxGvpMV
Added: _$ss4SpanVss15BitwiseCopyableRzlE5bytess03RawA0VvpMV
Added: _$sSS8UTF8ViewV4spans4SpanVys5UInt8VGvg
Added: _$sSS8UTF8ViewV4spans4SpanVys5UInt8VGvpMV
Added: _$sSs8UTF8ViewV4spans4SpanVys5UInt8VGvg
Added: _$sSs8UTF8ViewV4spans4SpanVys5UInt8VGvpMV
// SE-0467 mutableSpan properties
Added: _$sSa11mutableSpans07MutableB0VyxGvr
@@ -1101,22 +1060,10 @@ Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss14M
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss14MutableRawSpanVN$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVMa$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVMn$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE5countSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE6_countSivg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE6_countSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE7indicesSnySiGvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE7isEmptySbvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE8_pointerSVSgvg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE8_pointerSVSgvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVss15BitwiseCopyableRzlE9uncheckedxSi_tcipMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVss15BitwiseCopyableRzlEyxSicipMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV11byteOffsetsSnySiGvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV6_countSivg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV6_countSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV7isEmptySbvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV8_pointerSVSgvg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV8_pointerSVSgvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV9byteCountSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanVMa$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanVMn$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanVN$
@@ -1128,3 +1075,15 @@ Added: _$ss8DurationV11nanosecondsyABSdFZ
Added: _$ss11InlineArrayVsRi__rlE8_storagexq_BVvM
Added: _$ss11InlineArrayVsRi__rlE8_storagexq_BVvs
// rdar://151628396: Retroactively give property descriptors to conditionally-copyable/escapable properties
Added: _$ss11InlineArrayVsRi__rlE10startIndexSivpMV
Added: _$ss11InlineArrayVsRi__rlE5countSivpMV
Added: _$ss11InlineArrayVsRi__rlE7_bufferSRyq_GvpMV
Added: _$ss11InlineArrayVsRi__rlE7indicesSnySiGvpMV
Added: _$ss11InlineArrayVsRi__rlE7isEmptySbvpMV
Added: _$ss11InlineArrayVsRi__rlE8_addressSPyq_GvpMV
Added: _$ss11InlineArrayVsRi__rlE8endIndexSivpMV
Added: _$ss8UTF8SpanV10_countMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV10_flagsMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV7_nfcBits6UInt64VvpZMV
Added: _$ss8UTF8SpanV9_asciiBits6UInt64VvpZMV

View File

@@ -797,21 +797,9 @@ Added: _$sSS5IndexVs28CustomDebugStringConvertiblesWP
Added: _$ss4SpanVMa
Added: _$ss4SpanVMn
Added: _$ss4SpanVsRi_zrlE6_countSivg
Added: _$ss4SpanVsRi_zrlE6_countSivpMV
Added: _$ss4SpanVsRi_zrlE8_pointerSVSgvg
Added: _$ss4SpanVsRi_zrlE8_pointerSVSgvpMV
Added: _$ss4SpanVsRi_zrlE5countSivpMV
Added: _$ss4SpanVsRi_zrlE7indicesSnySiGvpMV
Added: _$ss4SpanVsRi_zrlE7isEmptySbvpMV
Added: _$ss4SpanVss15BitwiseCopyableRzlE9uncheckedxSi_tcipMV
Added: _$ss4SpanVss15BitwiseCopyableRzlEyxSicipMV
Added: _$ss7RawSpanV11byteOffsetsSnySiGvpMV
Added: _$ss7RawSpanV6_countSivg
Added: _$ss7RawSpanV6_countSivpMV
Added: _$ss7RawSpanV7isEmptySbvpMV
Added: _$ss7RawSpanV8_pointerSVSgvg
Added: _$ss7RawSpanV8_pointerSVSgvpMV
Added: _$ss7RawSpanV9byteCountSivpMV
Added: _$ss7RawSpanVMa
Added: _$ss7RawSpanVMn
Added: _$ss7RawSpanVN
@@ -819,9 +807,7 @@ Added: _$ss7RawSpanVN
// SE-0464 UTF8Span
Added: _$sSS7copyingSSs8UTF8SpanV_tcfC
Added: _$sSS8utf8Spans04UTF8B0Vvg
Added: _$sSS8utf8Spans04UTF8B0VvpMV
Added: _$sSs8utf8Spans04UTF8B0Vvg
Added: _$sSs8utf8Spans04UTF8B0VvpMV
Added: _$ss7UnicodeO4UTF8O15ValidationErrorV11byteOffsetsSnySiGvM
Added: _$ss7UnicodeO4UTF8O15ValidationErrorV11byteOffsetsSnySiGvg
Added: _$ss7UnicodeO4UTF8O15ValidationErrorV11byteOffsetsSnySiGvpMV
@@ -874,21 +860,15 @@ Added: _$ss7UnicodeO4UTF8O15ValidationErrorVs23CustomStringConvertiblesMc
Added: _$ss7UnicodeO4UTF8O15ValidationErrorVs23CustomStringConvertiblesWP
Added: _$ss7UnicodeO4UTF8O15_checkAllErrorsySayAD15ValidationErrorVGxSTRzs5UInt8V7ElementRtzlFZ
Added: _$ss8UTF8SpanV9unchecked12isKnownASCIIABs0B0Vys5UInt8VG_SbtcfC
Added: _$ss8UTF8SpanV10_countMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV10_flagsMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV10isKnownNFCSbvpMV
Added: _$ss8UTF8SpanV10validatingABs0B0Vys5UInt8VG_ts7UnicodeO0A0O15ValidationErrorVYKcfC
Added: _$ss8UTF8SpanV11checkForNFC10quickCheckS2b_tF
Added: _$ss8UTF8SpanV12isKnownASCIISbvpMV
Added: _$ss8UTF8SpanV13checkForASCIISbyF
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64VvM
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64Vvg
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64VvpMV
Added: _$ss8UTF8SpanV14_countAndFlagss6UInt64Vvs
Added: _$ss8UTF8SpanV17CharacterIteratorV11skipForward2byS2i_tF
Added: _$ss8UTF8SpanV17CharacterIteratorV11skipForwardSiyF
Added: _$ss8UTF8SpanV17CharacterIteratorV21currentCodeUnitOffsetSivg
Added: _$ss8UTF8SpanV17CharacterIteratorV21currentCodeUnitOffsetSivpMV
Added: _$ss8UTF8SpanV17CharacterIteratorV4nextSJSgyF
Added: _$ss8UTF8SpanV17CharacterIteratorV5reset20roundingForwardsFromySi_tF
Added: _$ss8UTF8SpanV17CharacterIteratorV5reset21roundingBackwardsFromySi_tF
@@ -899,19 +879,16 @@ Added: _$ss8UTF8SpanV17CharacterIteratorV8previousSJSgyF
Added: _$ss8UTF8SpanV17CharacterIteratorV8skipBack2byS2i_tF
Added: _$ss8UTF8SpanV17CharacterIteratorV8skipBackSiyF
Added: _$ss8UTF8SpanV17CharacterIteratorV9codeUnitsABvg
Added: _$ss8UTF8SpanV17CharacterIteratorV9codeUnitsABvpMV
Added: _$ss8UTF8SpanV17CharacterIteratorVMa
Added: _$ss8UTF8SpanV17CharacterIteratorVMn
Added: _$ss8UTF8SpanV17CharacterIteratorVN
Added: _$ss8UTF8SpanV17CharacterIteratorVyAdBcfC
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvM
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvg
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvpMV
Added: _$ss8UTF8SpanV18_unsafeBaseAddressSVSgvs
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV11skipForward2byS2i_tF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV11skipForwardSiyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV21currentCodeUnitOffsetSivg
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV21currentCodeUnitOffsetSivpMV
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV4nexts0C0O0D0VSgyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV5reset20roundingForwardsFromySi_tF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV5reset21roundingBackwardsFromySi_tF
@@ -922,7 +899,6 @@ Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV8previouss0C0O0D0VSgyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV8skipBack2byS2i_tF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV8skipBackSiyF
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV9codeUnitsABvg
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorV9codeUnitsABvpMV
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorVMa
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorVMn
Added: _$ss8UTF8SpanV21UnicodeScalarIteratorVN
@@ -932,12 +908,7 @@ Added: _$ss8UTF8SpanV21makeCharacterIteratorAB0dE0VyF
Added: _$ss8UTF8SpanV23isCanonicallyEquivalent2toSbAB_tF
Added: _$ss8UTF8SpanV25makeUnicodeScalarIteratorAB0deF0VyF
Added: _$ss8UTF8SpanV4spans0B0Vys5UInt8VGvg
Added: _$ss8UTF8SpanV4spans0B0Vys5UInt8VGvpMV
Added: _$ss8UTF8SpanV5countSivpMV
Added: _$ss8UTF8SpanV7_nfcBits6UInt64VvpZMV
Added: _$ss8UTF8SpanV7isEmptySbvg
Added: _$ss8UTF8SpanV7isEmptySbvpMV
Added: _$ss8UTF8SpanV9_asciiBits6UInt64VvpZMV
Added: _$ss8UTF8SpanVMa
Added: _$ss8UTF8SpanVMn
Added: _$ss8UTF8SpanVN
@@ -956,20 +927,8 @@ Added: _$ss14MutableRawSpanVMn
Added: _$ss14MutableRawSpanVN
// SE-0456 Span-providing properties
Added: _$sSRsRi_zrlE4spans4SpanVyxGvpMV
Added: _$sSW5bytess7RawSpanVvpMV
Added: _$sSa4spans4SpanVyxGvpMV
Added: _$sSrsRi_zrlE4spans4SpanVyxGvpMV
Added: _$sSw5bytess7RawSpanVvpMV
Added: _$ss10ArraySliceV4spans4SpanVyxGvpMV
Added: _$ss13KeyValuePairsV4spans4SpanVyx3key_q_5valuetGvpMV
Added: _$ss15CollectionOfOneV4spans4SpanVyxGvpMV
Added: _$ss15ContiguousArrayV4spans4SpanVyxGvpMV
Added: _$ss4SpanVss15BitwiseCopyableRzlE5bytess03RawA0VvpMV
Added: _$sSS8UTF8ViewV4spans4SpanVys5UInt8VGvg
Added: _$sSS8UTF8ViewV4spans4SpanVys5UInt8VGvpMV
Added: _$sSs8UTF8ViewV4spans4SpanVys5UInt8VGvg
Added: _$sSs8UTF8ViewV4spans4SpanVys5UInt8VGvpMV
// SE-0467 mutableSpan properties
Added: _$sSa11mutableSpans07MutableB0VyxGvr
@@ -1102,22 +1061,10 @@ Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss14M
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss14MutableRawSpanVN$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVMa$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVMn$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE5countSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE6_countSivg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE6_countSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE7indicesSnySiGvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE7isEmptySbvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE8_pointerSVSgvg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVsRi_zrlE8_pointerSVSgvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVss15BitwiseCopyableRzlE9uncheckedxSi_tcipMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss4SpanVss15BitwiseCopyableRzlEyxSicipMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV11byteOffsetsSnySiGvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV6_countSivg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV6_countSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV7isEmptySbvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV8_pointerSVSgvg$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV8_pointerSVSgvpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanV9byteCountSivpMV$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanVMa$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanVMn$
Added: $ld$previous$@rpath/libswiftCompatibilitySpan.dylib$$1$10.14$15.0$_$ss7RawSpanVN$
@@ -1129,3 +1076,15 @@ Added: _$ss8DurationV11nanosecondsyABSdFZ
Added: _$ss11InlineArrayVsRi__rlE8_storagexq_BVvM
Added: _$ss11InlineArrayVsRi__rlE8_storagexq_BVvs
// rdar://151628396: Retroactively give property descriptors to conditionally-copyable/escapable properties
Added: _$ss11InlineArrayVsRi__rlE10startIndexSivpMV
Added: _$ss11InlineArrayVsRi__rlE5countSivpMV
Added: _$ss11InlineArrayVsRi__rlE7_bufferSRyq_GvpMV
Added: _$ss11InlineArrayVsRi__rlE7indicesSnySiGvpMV
Added: _$ss11InlineArrayVsRi__rlE7isEmptySbvpMV
Added: _$ss11InlineArrayVsRi__rlE8_addressSPyq_GvpMV
Added: _$ss11InlineArrayVsRi__rlE8endIndexSivpMV
Added: _$ss8UTF8SpanV10_countMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV10_flagsMasks6UInt64VvpZMV
Added: _$ss8UTF8SpanV7_nfcBits6UInt64VvpZMV
Added: _$ss8UTF8SpanV9_asciiBits6UInt64VvpZMV