mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Merge pull request #85450 from kavon/keypath-metadata-fix
IRGen/ABI: fix count of requirements in getAddrOfGenericEnvironment
This commit is contained in:
@@ -4669,9 +4669,13 @@ llvm::Constant *IRGenModule::getAddrOfGenericEnvironment(
|
||||
}
|
||||
genericParamCounts.push_back(genericParamCount);
|
||||
|
||||
SmallVector<Requirement, 2> reqs;
|
||||
SmallVector<InverseRequirement, 2> inverses;
|
||||
signature->getRequirementsWithInverses(reqs, inverses);
|
||||
|
||||
auto flags = GenericEnvironmentFlags()
|
||||
.withNumGenericParameterLevels(genericParamCounts.size())
|
||||
.withNumGenericRequirements(signature.getRequirements().size());
|
||||
.withNumGenericRequirements(reqs.size());
|
||||
|
||||
ConstantStructBuilder fields = builder.beginStruct();
|
||||
fields.setPacked(true);
|
||||
@@ -4698,7 +4702,7 @@ llvm::Constant *IRGenModule::getAddrOfGenericEnvironment(
|
||||
fields.addAlignmentPadding(Alignment(4));
|
||||
|
||||
// Generic requirements
|
||||
irgen::addGenericRequirements(*this, fields, signature);
|
||||
irgen::addGenericRequirements(*this, fields, signature, reqs, inverses);
|
||||
return fields.finishAndCreateFuture();
|
||||
});
|
||||
}
|
||||
|
||||
29
test/IRGen/keypaths_inverses.swift
Normal file
29
test/IRGen/keypaths_inverses.swift
Normal file
@@ -0,0 +1,29 @@
|
||||
// RUN: %target-swift-frontend -module-name keypaths -emit-ir %s | %FileCheck %s
|
||||
|
||||
// The purpose of this test is to validate that a keypath formed via a protocol
|
||||
// that has an inverse requirement on Self produces the same generic environment
|
||||
// metadata as one without the inverse. So Mashable and Dashable should have the
|
||||
// same metadata fundamentally.
|
||||
|
||||
// CHECK-LABEL: @"generic environment 8keypaths8MashableRzl" = linkonce_odr hidden constant
|
||||
// CHECK-SAME: i32 4097, i16 1, i8 -128, [1 x i8] zeroinitializer, i32 128
|
||||
|
||||
// CHECK-LABEL: @"generic environment 8keypaths8DashableRzl" = linkonce_odr hidden constant
|
||||
// CHECK-SAME: i32 4097, i16 1, i8 -128, [1 x i8] zeroinitializer, i32 128
|
||||
|
||||
|
||||
protocol Mashable: ~Copyable {
|
||||
var masher: String { get set }
|
||||
}
|
||||
|
||||
protocol Dashable {
|
||||
var dasher: String { get set }
|
||||
}
|
||||
|
||||
func formKeypath1<T: Mashable>(_ t: T) -> WritableKeyPath<T, String> {
|
||||
return \T.masher
|
||||
}
|
||||
|
||||
func formKeypath2<T: Dashable>(_ t: T) -> WritableKeyPath<T, String> {
|
||||
return \T.dasher
|
||||
}
|
||||
Reference in New Issue
Block a user