Require extend before base: BaseType; (#3459)

This commit is contained in:
josh11b
2023-12-06 20:14:16 +00:00
committed by GitHub
parent f4677eea8d
commit a970b1e587
18 changed files with 383 additions and 181 deletions
+14 -2
View File
@@ -165,8 +165,8 @@ auto HandleClassDefinitionStart(Context& context, Parse::NodeId parse_node)
return true;
}
auto HandleBaseIntroducer(Context& /*context*/, Parse::NodeId /*parse_node*/)
-> bool {
auto HandleBaseIntroducer(Context& context, Parse::NodeId parse_node) -> bool {
context.decl_state_stack().Push(DeclState::Base, parse_node);
return true;
}
@@ -178,6 +178,18 @@ auto HandleBaseColon(Context& /*context*/, Parse::NodeId /*parse_node*/)
auto HandleBaseDecl(Context& context, Parse::NodeId parse_node) -> bool {
auto base_type_expr_id = context.node_stack().PopExpr();
// Process modifiers. `extend` is required, none others are allowed.
LimitModifiersOnDecl(context, KeywordModifierSet::Extend,
Lex::TokenKind::Base);
auto modifiers = context.decl_state_stack().innermost().modifier_set;
if (!(modifiers & KeywordModifierSet::Extend)) {
CARBON_DIAGNOSTIC(BaseMissingExtend, Error,
"Missing `extend` before `base` declaration in class.");
context.emitter().Emit(context.decl_state_stack().innermost().first_node,
BaseMissingExtend);
}
context.decl_state_stack().Pop(DeclState::Base);
auto enclosing_class_decl = context.GetCurrentScopeAs<SemIR::ClassDecl>();
if (!enclosing_class_decl) {
CARBON_DIAGNOSTIC(BaseOutsideClass, Error,