mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-02 17:15:49 +01:00
Propagate error state in an `extend impl` declaration out to the enclosing scope. We can do this generically in `ApplyExtendImplAs` so we don't have to do it explicitly in other places. Collapse `DiagnoseExtendImplOutsideClass` into `ApplyExtendImplAs` as it had only the one caller and is very small, so this simplifies the code, making `ApplyExtendImplAs` a clear set of diagnostics. And push the construction of the SpecificConstant down into `ApplyExtendImplAs` so it is only constructed if it's needed, instead of constructing it and throwing it away in error cases. Ensure any error in the declaration results in the witness being an ErrorInst so the impl will not be used in impl lookup. This simplifies some branches by combining them into a single if statement. This is part of #6420 which is being split up into a chain of smaller PRs. It is based on #6467.
56 lines
1.7 KiB
Plaintext
56 lines
1.7 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/convert.carbon
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/impl/extend_final.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/impl/extend_final.carbon
|
|
|
|
// --- extend_final_impl.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
interface Z {
|
|
let X:! type;
|
|
}
|
|
|
|
class C {
|
|
extend final impl as Z where .X = () {}
|
|
}
|
|
|
|
fn F() {
|
|
let b: C.X = ();
|
|
}
|
|
|
|
// --- fail_final_extend_impl.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
interface Z {}
|
|
|
|
class C {
|
|
// CHECK:STDERR: fail_final_extend_impl.carbon:[[@LINE+7]]:9: error: `extend` must appear before `final` [ModifierMustAppearBefore]
|
|
// CHECK:STDERR: final extend impl as Z {}
|
|
// CHECK:STDERR: ^~~~~~
|
|
// CHECK:STDERR: fail_final_extend_impl.carbon:[[@LINE+4]]:3: note: `final` previously appeared here [ModifierPrevious]
|
|
// CHECK:STDERR: final extend impl as Z {}
|
|
// CHECK:STDERR: ^~~~~
|
|
// CHECK:STDERR:
|
|
final extend impl as Z {}
|
|
}
|
|
|
|
// --- fail_final_extend_impl_outside_class.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
interface Z {}
|
|
|
|
class C {}
|
|
|
|
// CHECK:STDERR: fail_final_extend_impl_outside_class.carbon:[[@LINE+4]]:1: error: `extend impl` can only be used in an interface or class [ExtendImplOutsideClass]
|
|
// CHECK:STDERR: extend final impl C as Z {}
|
|
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// CHECK:STDERR:
|
|
extend final impl C as Z {}
|