Implement static var class fields (#7215)

This adds the `static` token to the lexer and parses it as a modifier.

In check, `FullPatternStack::Kind::FieldDecl` is now used for both
static and non-static vars. Static vars get treated basically the same
as `NameBindingDecl`s.

Global initialization is used for static var initializers. To make the
necessary stack information available to `pattern_match.cpp`, the
`full_pattern_stack` and `decl_introducer_state_stack` are now popped
later in `handle_let_and_var.cpp`.

In lowering, each class's body is checked for `VarStorage` insts and
lowered the same as global vars.
This commit is contained in:
Nicholas Bishop
2026-05-18 20:09:17 +00:00
committed by GitHub
parent 31db4a0931
commit 773ecdfac6
21 changed files with 380 additions and 69 deletions
+2 -1
View File
@@ -2,6 +2,7 @@
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include "toolchain/check/class.h"
#include "toolchain/check/context.h"
#include "toolchain/check/handle.h"
#include "toolchain/check/inst.h"
@@ -96,7 +97,7 @@ auto HandleParseNode(Context& context, Parse::TuplePatternId node_id) -> bool {
llvm::SmallVector<SemIR::InstId> type_inst_ids;
type_inst_ids.reserve(inst_block.size());
for (auto inst : inst_block) {
if (context.full_pattern_stack().IsCurrentKindFieldDecl()) {
if (InNonStaticFieldDecl(context)) {
CARBON_DIAGNOSTIC(FieldWithTuplePattern, Error,
"found tuple pattern in class `var` decl");
context.emitter().Emit(LocIdForDiagnostics::TokenOnly(node_id),