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())
+14
View File
@@ -0,0 +1,14 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// AUTOUPDATE
package ExplorerTest api;
// CHECK:STDERR: COMPILATION ERROR: fail_impl_as_symbolic.carbon:[[@LINE+1]]: value of generic binding T is not known
impl forall [T:! ({}, )] {} as T {
}
fn Main() -> i32 {
}
+15
View File
@@ -0,0 +1,15 @@
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// AUTOUPDATE
package ExplorerTest api;
interface X {
}
// CHECK:STDERR: COMPILATION ERROR: fail_impl_symbolic_as.carbon:[[@LINE+1]]: value of generic binding Y is not known
impl forall [Y:! (X, )] Y as true {
}
fn Main() -> i32 {
}