mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 06:21:04 +01:00
When we check an `impl` decl, find the containing `match_first` block, if any, and store a connection to it in the `SemIR::Impl` structure, along with the impl's position in that `match_first` block so that we can sort/prioritize the `SemIR::Impl`s later. Also, update the `is_final` flag if the `match_first` block is modified as `final`. But ensure we diagnose trying to put a `final impl`, or a redeclaration of one, in a `match_first` block. Also diagnose if an impl is attached to a `match_first` block more than once - either in two different blocks or in the same block at different positions. Putting the `match_first` connection on the `SemIR::Impl` structure means we have to import it, so implement import and add a smoke test for that, which ensures nothing explodes. Drop the `scope_stack` entry for the `match_first` block, as it was not needed. Once we started tracking the `match_first` size on the `Context` class, it became more straightforward to just store the `match_first` decl `InstId` in the same place. The `match_first` block is not supposed to act like a different scope for the purpose of redecls anyhow, so it's a bit simpler this way.
31 lines
882 B
Plaintext
31 lines
882 B
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
|
|
// ^ARGS: -v compile %s
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/match_first/import.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/match_first/import.carbon
|
|
|
|
// --- for_import.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
interface Z { let Z1: type; }
|
|
|
|
final match_first {
|
|
impl () as Z where .Z1 = () {}
|
|
}
|
|
|
|
// --- import.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
import library "for_import";
|
|
|
|
fn F() {
|
|
let _: ().(Z.Z1) = ();
|
|
}
|