@@ -2423,14 +2423,17 @@ static PackType *replaceTypeVariablesWithFreshPacks(ConstraintSystem &cs,
24232423 // wrapping a pack type variable. Otherwise, create a new scalar
24242424 // type variable.
24252425 //
2426- // FIXME: Locator for diagnostics
24272426 // FIXME: Other TVO_* flags for type variables?
2427+ auto elementLoc = cs.getConstraintLocator(loc,
2428+ LocatorPathElt::PackElement(freshTypeVars.size()));
24282429 if (packExpansionElt != nullptr) {
2429- auto *freshTypeVar = cs.createTypeVariable(loc, TVO_CanBindToPack);
2430+ auto *freshTypeVar =
2431+ cs.createTypeVariable(elementLoc, TVO_CanBindToPack);
24302432 freshTypeVars.push_back(PackExpansionType::get(
24312433 freshTypeVar, packExpansionElt->getCountType()));
24322434 } else {
2433- freshTypeVars.push_back(cs.createTypeVariable(loc, /*options=*/0));
2435+ freshTypeVars.push_back(
2436+ cs.createTypeVariable(elementLoc, /*options=*/0));
24342437 }
24352438 }
24362439 }
@@ -2483,7 +2486,6 @@ static PackType *replaceTypeVariablesWithFreshPacks(ConstraintSystem &cs,
24832486 // Bind each pack type variable occurring in the pattern type to its
24842487 // binding pack that was constructed above.
24852488 for (const auto &pair : typeVars) {
2486- // FIXME: Locator for diagnostics
24872489 cs.addConstraint(ConstraintKind::Bind,
24882490 pair.first, PackType::get(ctx, pair.second), locator);
24892491 }
@@ -2498,10 +2500,9 @@ ConstraintSystem::matchPackExpansionTypes(PackExpansionType *expansion1,
24982500 ConstraintKind kind, TypeMatchOptions flags,
24992501 ConstraintLocatorBuilder locator) {
25002502 // The count types of two pack expansion types must have the same shape.
2501- //
2502- // FIXME: Locator for diagnostics.
2503- auto *loc = getConstraintLocator(locator);
2504- auto *shapeTypeVar = createTypeVariable(loc, TVO_CanBindToPack);
2503+ auto *shapeLoc = getConstraintLocator(
2504+ locator.withPathElement(ConstraintLocator::PackShape));
2505+ auto *shapeTypeVar = createTypeVariable(shapeLoc, TVO_CanBindToPack);
25052506 addConstraint(ConstraintKind::ShapeOf,
25062507 expansion1->getCountType(), shapeTypeVar, locator);
25072508 addConstraint(ConstraintKind::ShapeOf,
@@ -2522,7 +2523,6 @@ ConstraintSystem::matchPackExpansionTypes(PackExpansionType *expansion1,
25222523 if (auto *pack2 = pattern2->getAs<PackType>()) {
25232524 if (auto *pack1 = replaceTypeVariablesWithFreshPacks(
25242525 *this, pattern1, pack2, locator)) {
2525- // FIXME: Locator for diagnostics.
25262526 addConstraint(kind, pack1, pack2, locator);
25272527 return getTypeMatchSuccess();
25282528 }
@@ -2538,7 +2538,6 @@ ConstraintSystem::matchPackExpansionTypes(PackExpansionType *expansion1,
25382538 if (auto *pack1 = pattern1->getAs<PackType>()) {
25392539 if (auto *pack2 = replaceTypeVariablesWithFreshPacks(
25402540 *this, pattern2, pack1, locator)) {
2541- // FIXME: Locator for diagnostics.
25422541 addConstraint(kind, pack1, pack2, locator);
25432542 return getTypeMatchSuccess();
25442543 }
@@ -6852,8 +6851,6 @@ ConstraintSystem::matchTypes(Type type1, Type type2, ConstraintKind kind,
68526851 kind, subflags, packLoc);
68536852 }
68546853 case TypeKind::PackExpansion: {
6855- // FIXME: Need a new locator element
6856-
68576854 auto expansion1 = cast<PackExpansionType>(desugar1);
68586855 auto expansion2 = cast<PackExpansionType>(desugar2);
68596856
@@ -7562,9 +7559,10 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifySubclassOfConstraint(
75627559 for (unsigned i = 0, e = packType->getNumElements(); i < e; ++i) {
75637560 auto eltType = packType->getElementType(i);
75647561 if (auto *packExpansionType = eltType->getAs<PackExpansionType>()) {
7565- // FIXME: Locator element for pack expansion pattern
7562+ auto patternLoc =
7563+ locator.withPathElement(ConstraintLocator::PackExpansionPattern);
75667564 addConstraint(ConstraintKind::SubclassOf, packExpansionType->getPatternType(),
7567- classType, locator.withPathElement(LocatorPathElt::PackElement(i)) );
7565+ classType, patternLoc );
75687566 } else {
75697567 addConstraint(ConstraintKind::SubclassOf, eltType,
75707568 classType, locator.withPathElement(LocatorPathElt::PackElement(i)));
@@ -7680,11 +7678,12 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyConformsToConstraint(
76807678 for (unsigned i = 0, e = packType->getNumElements(); i < e; ++i) {
76817679 auto eltType = packType->getElementType(i);
76827680 if (auto *packExpansionType = eltType->getAs<PackExpansionType>()) {
7683- // FIXME: Locator element for pack expansion pattern
7681+ auto patternLoc =
7682+ locator.withPathElement(ConstraintLocator::PackExpansionPattern);
76847683 addConstraint(ConstraintKind::ConformsTo,
76857684 packExpansionType->getPatternType(),
76867685 protocol->getDeclaredInterfaceType(),
7687- locator.withPathElement(LocatorPathElt::PackElement(i)) );
7686+ patternLoc );
76887687 } else {
76897688 addConstraint(ConstraintKind::ConformsTo, eltType,
76907689 protocol->getDeclaredInterfaceType(),
@@ -14158,8 +14157,9 @@ void ConstraintSystem::addConstraint(Requirement req,
1415814157 auto type1 = req.getFirstType();
1415914158 auto type2 = req.getSecondType();
1416014159
14161- // FIXME: Locator for diagnostics
14162- auto typeVar = createTypeVariable(getConstraintLocator(locator),
14160+ auto *shapeLoc = getConstraintLocator(
14161+ locator.withPathElement(ConstraintLocator::PackShape));
14162+ auto typeVar = createTypeVariable(shapeLoc,
1416314163 TVO_CanBindToPack);
1416414164
1416514165 addConstraint(ConstraintKind::ShapeOf, type1, typeVar, locator);
0 commit comments