@@ -1170,7 +1170,7 @@ ConstantValue SimpleAssignmentPatternExpression::applyConversions(EvalContext& c
11701170
11711171static const Expression* matchElementValue (
11721172 const ASTContext& context, const Type& elementType, const FieldSymbol* targetField,
1173- SourceRange sourceRange ,
1173+ const Type& assignmentTargetType, const StructuredAssignmentPatternSyntax& syntax ,
11741174 std::span<const StructuredAssignmentPatternExpression::TypeSetter> typeSetters,
11751175 const Expression* defaultSetter) {
11761176
@@ -1227,8 +1227,8 @@ static const Expression* matchElementValue(
12271227 if (type.isError () || field.name .empty ())
12281228 return nullptr ;
12291229
1230- auto elemExpr = matchElementValue (context, type, &field, sourceRange, typeSetters ,
1231- defaultSetter);
1230+ auto elemExpr = matchElementValue (context, type, &field, assignmentTargetType, syntax ,
1231+ typeSetters, defaultSetter);
12321232 if (!elemExpr)
12331233 return nullptr ;
12341234
@@ -1237,15 +1237,16 @@ static const Expression* matchElementValue(
12371237
12381238 auto & comp = context.getCompilation ();
12391239 return comp.emplace <SimpleAssignmentPatternExpression>(elementType, /* isLValue */ false ,
1240- elements.copy (comp), sourceRange);
1240+ elements.copy (comp),
1241+ syntax.sourceRange ());
12411242 }
12421243
12431244 if (elementType.isArray () && elementType.hasFixedRange ()) {
12441245 auto nestedElemType = elementType.getArrayElementType ();
12451246 SLANG_ASSERT (nestedElemType);
12461247
1247- auto elemExpr = matchElementValue (context, *nestedElemType, nullptr , sourceRange ,
1248- typeSetters, defaultSetter);
1248+ auto elemExpr = matchElementValue (context, *nestedElemType, targetField ,
1249+ assignmentTargetType, syntax, typeSetters, defaultSetter);
12491250 if (!elemExpr)
12501251 return nullptr ;
12511252
@@ -1256,7 +1257,8 @@ static const Expression* matchElementValue(
12561257
12571258 auto & comp = context.getCompilation ();
12581259 return comp.emplace <SimpleAssignmentPatternExpression>(elementType, /* isLValue */ false ,
1259- elements.copy (comp), sourceRange);
1260+ elements.copy (comp),
1261+ syntax.sourceRange ());
12601262 }
12611263
12621264 // Finally, if we have a default then it must now be assignment compatible.
@@ -1265,12 +1267,15 @@ static const Expression* matchElementValue(
12651267
12661268 // Otherwise there's no setter for this element, which is an error.
12671269 if (targetField) {
1268- auto & diag = context.addDiag (diag::AssignmentPatternNoMember, sourceRange);
1270+ auto & diag = context.addDiag (diag::AssignmentPatternNoMember,
1271+ syntax.getFirstToken ().range ());
12691272 diag << targetField->name ;
12701273 diag.addNote (diag::NoteDeclarationHere, targetField->location );
12711274 }
12721275 else {
1273- context.addDiag (diag::AssignmentPatternMissingElements, sourceRange);
1276+ SLANG_ASSERT (assignmentTargetType.hasFixedRange ());
1277+ context.addDiag (diag::AssignmentPatternMissingElements, syntax.getFirstToken ().range ())
1278+ << assignmentTargetType;
12741279 }
12751280
12761281 return nullptr ;
@@ -1390,7 +1395,7 @@ Expression& StructuredAssignmentPatternExpression::forStruct(
13901395 continue ;
13911396 }
13921397
1393- auto expr = matchElementValue (context, fieldType, &field, sourceRange , typeSetters,
1398+ auto expr = matchElementValue (context, fieldType, &field, type, syntax , typeSetters,
13941399 defaultSetter);
13951400 if (!expr) {
13961401 bad = true ;
@@ -1504,8 +1509,8 @@ Expression& StructuredAssignmentPatternExpression::forFixedArray(
15041509 }
15051510
15061511 if (!cachedVal) {
1507- cachedVal = matchElementValue (context, elementType, nullptr , syntax. sourceRange () ,
1508- typeSetters, defaultSetter);
1512+ cachedVal = matchElementValue (context, elementType, nullptr , type, syntax, typeSetters ,
1513+ defaultSetter);
15091514 if (!cachedVal.value ()) {
15101515 bad = true ;
15111516 break ;
@@ -1567,7 +1572,7 @@ Expression& StructuredAssignmentPatternExpression::forDynamicArray(
15671572 // If there is a default setter expression, translate it to the target type
15681573 // of the array, and store that in case we need it to do constant evaluation.
15691574 if (defaultSetter) {
1570- auto matched = matchElementValue (context, elementType, nullptr , syntax. sourceRange () , {},
1575+ auto matched = matchElementValue (context, elementType, nullptr , type, syntax, {},
15711576 defaultSetter);
15721577 if (!matched)
15731578 bad = true ;
@@ -1578,7 +1583,9 @@ Expression& StructuredAssignmentPatternExpression::forDynamicArray(
15781583 SmallVector<const Expression*> elements;
15791584 if (indexMap.size () != maxIndex + 1 && !defaultSetter) {
15801585 if (!bad) {
1581- context.addDiag (diag::AssignmentPatternMissingElements, sourceRange);
1586+ context.addDiag (diag::AssignmentPatternMissingDynamicElements,
1587+ syntax.getFirstToken ().range ())
1588+ << maxIndex + 1 << type;
15821589 bad = true ;
15831590 }
15841591 }
0 commit comments