mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Trying to conform with #4009. Changes SemIR::LocIdAndInst construction to root out struct init cases with AddInst and related functions. I'm using templating of AddInst functions in order to avoid `AddInst(loc_id, InstName{...})` and instead have `AddInst<InstName>(loc_id, {...})` with I think similar readability results. There are a couple cases where inst construction is templated and so designated initializers couldn't be used, so this may be better for those in particular due to the extra type enforcement. This probably doesn't clean up every last case, but I was trying to get the bulk at once without bleeding over into less related changes. --------- Co-authored-by: Richard Smith <richard@metafoo.co.uk>
58 lines
2.0 KiB
C++
58 lines
2.0 KiB
C++
// 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 "toolchain/check/context.h"
|
|
#include "toolchain/check/convert.h"
|
|
#include "toolchain/parse/node_kind.h"
|
|
|
|
namespace Carbon::Check {
|
|
|
|
auto HandleArrayExprStart(Context& /*context*/,
|
|
Parse::ArrayExprStartId /*node_id*/) -> bool {
|
|
return true;
|
|
}
|
|
|
|
auto HandleArrayExprSemi(Context& context, Parse::ArrayExprSemiId node_id)
|
|
-> bool {
|
|
context.node_stack().Push(node_id);
|
|
return true;
|
|
}
|
|
|
|
auto HandleArrayExpr(Context& context, Parse::ArrayExprId node_id) -> bool {
|
|
// TODO: Handle array type with undefined bound.
|
|
if (context.node_stack()
|
|
.PopAndDiscardSoloNodeIdIf<Parse::NodeKind::ArrayExprSemi>()) {
|
|
context.node_stack().PopAndIgnore();
|
|
return context.TODO(node_id, "HandleArrayExprWithoutBounds");
|
|
}
|
|
|
|
auto bound_inst_id = context.node_stack().PopExpr();
|
|
context.node_stack()
|
|
.PopAndDiscardSoloNodeId<Parse::NodeKind::ArrayExprSemi>();
|
|
auto [element_type_node_id, element_type_inst_id] =
|
|
context.node_stack().PopExprWithNodeId();
|
|
|
|
// The array bound must be a constant.
|
|
//
|
|
// TODO: Should we support runtime-phase bounds in cases such as:
|
|
// comptime fn F(n: i32) -> type { return [i32; n]; }
|
|
auto bound_inst = context.constant_values().Get(bound_inst_id);
|
|
if (!bound_inst.is_constant()) {
|
|
CARBON_DIAGNOSTIC(InvalidArrayExpr, Error,
|
|
"Array bound is not a constant.");
|
|
context.emitter().Emit(bound_inst_id, InvalidArrayExpr);
|
|
context.node_stack().Push(node_id, SemIR::InstId::BuiltinError);
|
|
return true;
|
|
}
|
|
|
|
context.AddInstAndPush<SemIR::ArrayType>(
|
|
node_id, {.type_id = SemIR::TypeId::TypeType,
|
|
.bound_id = bound_inst_id,
|
|
.element_type_id = ExprAsType(context, element_type_node_id,
|
|
element_type_inst_id)});
|
|
return true;
|
|
}
|
|
|
|
} // namespace Carbon::Check
|