Skip to content

Commit 334efb9

Browse files
committed
[ConstraintSystem] Always pass in a direct instance of OpenPackElementType instead
of assigning it to std::function_ref. std::function_ref does not own the function reference, so assigning an OpenPackElementType to a local function_ref lead to stale constraint system references when invoking operator () later on.
1 parent 7b35e85 commit 334efb9

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

include/swift/Sema/ConstraintSystem.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6117,11 +6117,19 @@ class OpenPackElementType {
61176117

61186118
public:
61196119
explicit OpenPackElementType(ConstraintSystem &cs,
6120-
ConstraintLocator *locator,
6120+
const ConstraintLocatorBuilder &locator,
61216121
GenericEnvironment *elementEnv)
6122-
: cs(cs), locator(locator), elementEnv(elementEnv) {}
6122+
: cs(cs), elementEnv(elementEnv) {
6123+
this->locator = cs.getConstraintLocator(locator);
6124+
}
61236125

61246126
Type operator()(Type packType) const {
6127+
// Only assert we have an element environment when invoking the function
6128+
// object. In cases where pack elements are referenced outside of a
6129+
// pack expansion, type resolution will error before opening the pack
6130+
// element.
6131+
assert(elementEnv);
6132+
61256133
auto *elementType = cs.createTypeVariable(locator, TVO_CanBindToHole);
61266134
auto elementLoc = cs.getConstraintLocator(locator,
61276135
LocatorPathElt::OpenedPackElement(elementEnv));

lib/Sema/CSGen.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,12 +1422,14 @@ namespace {
14221422
// Introduce type variables for unbound generics.
14231423
const auto genericOpener = OpenUnboundGenericType(CS, locator);
14241424
const auto placeholderHandler = HandlePlaceholderType(CS, locator);
1425-
OpenPackElementFn packElementOpener = nullptr;
1425+
1426+
// Add a PackElementOf constraint for 'each T' type reprs.
1427+
GenericEnvironment *elementEnv = nullptr;
14261428
if (!PackElementEnvironments.empty()) {
14271429
options |= TypeResolutionFlags::AllowPackReferences;
1428-
packElementOpener = OpenPackElementType(CS,
1429-
CS.getConstraintLocator(locator), PackElementEnvironments.back());
1430+
elementEnv = PackElementEnvironments.back();
14301431
}
1432+
const auto packElementOpener = OpenPackElementType(CS, locator, elementEnv);
14311433

14321434
const auto result = TypeResolution::resolveContextualType(
14331435
repr, CS.DC, options, genericOpener, placeholderHandler,
@@ -1673,17 +1675,17 @@ namespace {
16731675
auto options =
16741676
TypeResolutionOptions(TypeResolverContext::InExpression);
16751677
for (auto specializationArg : specializationArgs) {
1676-
OpenPackElementFn packElementOpener = nullptr;
1678+
GenericEnvironment *elementEnv = nullptr;
16771679
if (!PackElementEnvironments.empty()) {
16781680
options |= TypeResolutionFlags::AllowPackReferences;
1679-
packElementOpener = OpenPackElementType(CS, locator, PackElementEnvironments.back());
1681+
elementEnv = PackElementEnvironments.back();
16801682
}
16811683
const auto result = TypeResolution::resolveContextualType(
16821684
specializationArg, CurDC, options,
16831685
// Introduce type variables for unbound generics.
16841686
OpenUnboundGenericType(CS, locator),
16851687
HandlePlaceholderType(CS, locator),
1686-
packElementOpener);
1688+
OpenPackElementType(CS, locator, elementEnv));
16871689
if (result->hasError())
16881690
return true;
16891691

@@ -1743,18 +1745,18 @@ namespace {
17431745
auto options =
17441746
TypeResolutionOptions(TypeResolverContext::InExpression);
17451747
for (size_t i = 0, e = specializations.size(); i < e; ++i) {
1746-
OpenPackElementFn packElementOpener = nullptr;
1748+
GenericEnvironment *elementEnv = nullptr;
17471749
if (!PackElementEnvironments.empty()) {
17481750
options |= TypeResolutionFlags::AllowPackReferences;
1749-
packElementOpener = OpenPackElementType(CS, locator, PackElementEnvironments.back());
1751+
elementEnv = PackElementEnvironments.back();
17501752
}
17511753

17521754
const auto result = TypeResolution::resolveContextualType(
17531755
specializations[i], CS.DC, options,
17541756
// Introduce type variables for unbound generics.
17551757
OpenUnboundGenericType(CS, locator),
17561758
HandlePlaceholderType(CS, locator),
1757-
packElementOpener);
1759+
OpenPackElementType(CS, locator, elementEnv));
17581760
if (result->hasError())
17591761
return Type();
17601762

0 commit comments

Comments
 (0)