mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Detect when evaluating an impl recursively tries to evaluate the same impl for the same or a more complex set of parameters. In order to perform the check after we have tested that the type structure matches and before we check that constraints are recursively satisfied, argument deduction is extended to check structural matching properties earlier. This requires us to separate match failures into two kinds: hard failures that produce errors that should never be swallowed, and soft failures such as a missing impl that lead us to merely discard an impl as a candidate. A flag has been added to `ImplScope` and `ArgumentDeduction` to specify whether soft failures should produce an error message or not.
37 lines
1.0 KiB
Plaintext
37 lines
1.0 KiB
Plaintext
// 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
|
|
// RUN: %{not} %{explorer-run}
|
|
// RUN: %{not} %{explorer-run-trace}
|
|
|
|
// TODO: Should this work?
|
|
|
|
package ExplorerTest api;
|
|
|
|
interface Vector {
|
|
let Dim:! i32;
|
|
}
|
|
external impl (i32, i32, i32) as Vector where .Dim = 3 {}
|
|
|
|
class Point(Scalar:! type, Dim:! i32) {}
|
|
|
|
fn F[Scalar:! type, V:! Vector where .Dim == 3](p: Point(Scalar, V.Dim), v: V) {}
|
|
|
|
fn G[Scalar:! type](p: Point(Scalar, 3)) {}
|
|
fn H[V:! Vector where .Dim == 3](v: V) {
|
|
var p: Point(i32, V.Dim) = {};
|
|
// CHECK:STDERR: COMPILATION ERROR: {{.*}}/explorer/testdata/assoc_const/fail_match_in_deduction.carbon:[[@LINE+1]]: mismatch in non-deduced values, `(V).(Vector.Dim)` != `3`
|
|
G(p);
|
|
}
|
|
|
|
fn Main() -> i32 {
|
|
var p: Point(i32, 3) = {};
|
|
// Deduce Point(Scalar, V.Dim) from Point(i32, 3).
|
|
F(p, (0, 0, 0));
|
|
// Deduce Point(Scalar, 3) from Point(i32, V.Dim).
|
|
H((0, 0, 0));
|
|
return 0;
|
|
}
|