mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 13:50:10 +01:00
Two somewhat related fixes. The first is call-specific for now (because it's the first action to take a `MetaInstId`), and the second is general across all actions, but it seems like calls are the easiest place to hit it. 1) Add support for refining inst blocks as action operands. Refine all the insts in the block, using the appropriate InstId-derived type. 2) When an action operand is a `MetaInstId` referring to an unattached constant, form a corresponding attached constant. This comes up when forming (for example) an implicit `AddWith(%T)` call, where the `%T` operand is an unattached constant. This causes us to form correct specifics in more cases, where previously we formed specifics that contained values that were still template-dependent. This unfortunately causes some existing template tests to produce more errors, but those errors reflect cases where we were previously silently doing the wrong thing.
65 lines
3.0 KiB
Plaintext
65 lines
3.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
|
|
//
|
|
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/generic/template/call.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/generic/template/call.carbon
|
|
|
|
// --- fail_todo_dependent_call_nonconst_arg.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
class X {}
|
|
class Y {}
|
|
fn F[template G: type](H: G, x: X) {
|
|
H(x);
|
|
}
|
|
fn TakeX(unused x: X) {}
|
|
|
|
// CHECK:STDERR: fail_todo_dependent_call_nonconst_arg.carbon:[[@LINE+14]]:23: error: expression cannot be used as a value [UseOfNonExprAsValue]
|
|
// CHECK:STDERR: fn GoodCall(x: X) { F(TakeX, x); }
|
|
// CHECK:STDERR: ^~~~~
|
|
// CHECK:STDERR: fail_todo_dependent_call_nonconst_arg.carbon:[[@LINE-8]]:24: note: initializing function parameter [InCallToFunctionParam]
|
|
// CHECK:STDERR: fn F[template G: type](H: G, x: X) {
|
|
// CHECK:STDERR: ^~~~
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_todo_dependent_call_nonconst_arg.carbon:[[@LINE+7]]:21: error: unable to monomorphize specific `F(<type of TakeX>)` [ResolvingSpecificHere]
|
|
// CHECK:STDERR: fn GoodCall(x: X) { F(TakeX, x); }
|
|
// CHECK:STDERR: ^
|
|
// CHECK:STDERR: fail_todo_dependent_call_nonconst_arg.carbon:[[@LINE-14]]:3: note: value of type `<type of TakeX>` is not callable [CallToNonCallable]
|
|
// CHECK:STDERR: H(x);
|
|
// CHECK:STDERR: ^~~~
|
|
// CHECK:STDERR:
|
|
fn GoodCall(x: X) { F(TakeX, x); }
|
|
|
|
// --- fail_dependent_call_nonconst_arg_wrong_type.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
class X {}
|
|
class Y {}
|
|
fn F[template G: type](H: G, x: X) {
|
|
H(x);
|
|
}
|
|
fn TakeY(unused y: Y) {}
|
|
|
|
// TODO: should fail, but not because of UseOfNonExprAsValue
|
|
// CHECK:STDERR: fail_dependent_call_nonconst_arg_wrong_type.carbon:[[@LINE+14]]:22: error: expression cannot be used as a value [UseOfNonExprAsValue]
|
|
// CHECK:STDERR: fn BadCall(x: X) { F(TakeY, x); }
|
|
// CHECK:STDERR: ^~~~~
|
|
// CHECK:STDERR: fail_dependent_call_nonconst_arg_wrong_type.carbon:[[@LINE-9]]:24: note: initializing function parameter [InCallToFunctionParam]
|
|
// CHECK:STDERR: fn F[template G: type](H: G, x: X) {
|
|
// CHECK:STDERR: ^~~~
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_dependent_call_nonconst_arg_wrong_type.carbon:[[@LINE+7]]:20: error: unable to monomorphize specific `F(<type of TakeY>)` [ResolvingSpecificHere]
|
|
// CHECK:STDERR: fn BadCall(x: X) { F(TakeY, x); }
|
|
// CHECK:STDERR: ^
|
|
// CHECK:STDERR: fail_dependent_call_nonconst_arg_wrong_type.carbon:[[@LINE-15]]:3: note: value of type `<type of TakeY>` is not callable [CallToNonCallable]
|
|
// CHECK:STDERR: H(x);
|
|
// CHECK:STDERR: ^~~~
|
|
// CHECK:STDERR:
|
|
fn BadCall(x: X) { F(TakeY, x); }
|