@@ -845,8 +845,8 @@ namespace {
845
845
/// found during our walk.
846
846
llvm::MapVector<UnresolvedMemberExpr *, Type> UnresolvedBaseTypes;
847
847
848
- /// A stack of pack element generic environments .
849
- llvm::SmallVector<GenericEnvironment *, 2> PackElementEnvironments;
848
+ /// A stack of pack expansions that can open pack elements .
849
+ llvm::SmallVector<PackExpansionExpr *, 2> PackElementEnvironments;
850
850
851
851
/// Returns false and emits the specified diagnostic if the member reference
852
852
/// base is a nil literal. Returns true otherwise.
@@ -1088,8 +1088,9 @@ namespace {
1088
1088
1089
1089
ConstraintSystem &getConstraintSystem() const { return CS; }
1090
1090
1091
- void addPackElementEnvironment(GenericEnvironment *env) {
1092
- PackElementEnvironments.push_back(env);
1091
+ void addPackElementEnvironment(PackExpansionExpr *expr) {
1092
+ CS.addPackElementEnvironment(expr);
1093
+ PackElementEnvironments.push_back(expr);
1093
1094
}
1094
1095
1095
1096
virtual Type visitErrorExpr(ErrorExpr *E) {
@@ -1424,7 +1425,7 @@ namespace {
1424
1425
const auto placeholderHandler = HandlePlaceholderType(CS, locator);
1425
1426
1426
1427
// Add a PackElementOf constraint for 'each T' type reprs.
1427
- GenericEnvironment *elementEnv = nullptr;
1428
+ PackExpansionExpr *elementEnv = nullptr;
1428
1429
if (!PackElementEnvironments.empty()) {
1429
1430
options |= TypeResolutionFlags::AllowPackReferences;
1430
1431
elementEnv = PackElementEnvironments.back();
@@ -1694,7 +1695,7 @@ namespace {
1694
1695
auto options =
1695
1696
TypeResolutionOptions(TypeResolverContext::InExpression);
1696
1697
for (auto specializationArg : specializationArgs) {
1697
- GenericEnvironment *elementEnv = nullptr;
1698
+ PackExpansionExpr *elementEnv = nullptr;
1698
1699
if (!PackElementEnvironments.empty()) {
1699
1700
options |= TypeResolutionFlags::AllowPackReferences;
1700
1701
elementEnv = PackElementEnvironments.back();
@@ -1764,7 +1765,7 @@ namespace {
1764
1765
auto options =
1765
1766
TypeResolutionOptions(TypeResolverContext::InExpression);
1766
1767
for (size_t i = 0, e = specializations.size(); i < e; ++i) {
1767
- GenericEnvironment *elementEnv = nullptr;
1768
+ PackExpansionExpr *elementEnv = nullptr;
1768
1769
if (!PackElementEnvironments.empty()) {
1769
1770
options |= TypeResolutionFlags::AllowPackReferences;
1770
1771
elementEnv = PackElementEnvironments.back();
@@ -3008,8 +3009,7 @@ namespace {
3008
3009
}
3009
3010
3010
3011
Type visitPackExpansionExpr(PackExpansionExpr *expr) {
3011
- auto *elementEnv = expr->getGenericEnvironment();
3012
- assert(PackElementEnvironments.back() == elementEnv);
3012
+ assert(PackElementEnvironments.back() == expr);
3013
3013
PackElementEnvironments.pop_back();
3014
3014
3015
3015
auto *patternLoc =
@@ -3018,10 +3018,8 @@ namespace {
3018
3018
TVO_CanBindToPack |
3019
3019
TVO_CanBindToHole);
3020
3020
auto elementResultType = CS.getType(expr->getPatternExpr());
3021
- auto *elementLoc = CS.getConstraintLocator(
3022
- expr, LocatorPathElt::OpenedPackElement(elementEnv));
3023
3021
CS.addConstraint(ConstraintKind::PackElementOf, elementResultType,
3024
- patternTy, elementLoc );
3022
+ patternTy, CS.getConstraintLocator(expr) );
3025
3023
3026
3024
auto *shapeLoc =
3027
3025
CS.getConstraintLocator(expr, ConstraintLocator::PackShape);
@@ -4063,7 +4061,7 @@ namespace {
4063
4061
}
4064
4062
4065
4063
if (auto *expansion = dyn_cast<PackExpansionExpr>(expr)) {
4066
- CG.addPackElementEnvironment(expansion->getGenericEnvironment() );
4064
+ CG.addPackElementEnvironment(expansion);
4067
4065
}
4068
4066
4069
4067
return Action::Continue(expr);
0 commit comments