Error evaluating symbolic tuple (#2957)

Reports an error (`value of generic binding T is not known`) instead of
performing an invalid cast when attempting to index into a tuple. Can
occur when trying to cast a generic constant in the interface position
of an implementation to `type`.

Closes #2938
This commit is contained in:
josh11b
2023-06-29 00:37:13 +00:00
committed by GitHub
parent f091a45c19
commit 798233fe23
3 changed files with 35 additions and 1 deletions
+6 -1
View File
@@ -1316,7 +1316,12 @@ auto Interpreter::StepExp() -> ErrorOr<Success> {
} else {
// { { v :: [][i] :: C, E, F} :: S, H}
// -> { { v_i :: C, E, F} : S, H}
const auto& tuple = cast<TupleValue>(*act.results()[0]);
CARBON_ASSIGN_OR_RETURN(
auto converted,
Convert(act.results()[0],
&cast<IndexExpression>(exp).object().static_type(),
exp.source_loc()));
const auto& tuple = cast<TupleValue>(*converted);
int i = cast<IntValue>(*act.results()[1]).value();
if (i < 0 || i >= static_cast<int>(tuple.elements().size())) {
return ProgramError(exp.source_loc())