Skip to content

Commit ccf41b6

Browse files
committed
Add enum items to value namespace as well
gcc/rust/ChangeLog: * resolve/rust-finalize-imports-2.0.cc (GlobbingVisitor::visit_enum_container): Conditionally insert into value namespace as well. * resolve/rust-forever-stack.hxx (ForeverStack::insert_variant): Add template specialization for value namespace. * resolve/rust-name-resolution-context.cc (NameResolutionContext::insert_variant): Allow insertion into value namespace. * resolve/rust-name-resolution-context.h (NameResolutionContext::insert_variant): Likewise. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::insert_enum_variant_or_error_out): Likewise. (TopLevel::visit): Use tweaked insert_enum_variant_or_error_out properly for all enum item kinds. * resolve/rust-toplevel-name-resolver-2.0.h (TopLevel::insert_enum_variant_or_error_out): Tweak function signature. * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): Fix typo. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
1 parent 0c1834c commit ccf41b6

7 files changed

+36
-17
lines changed

gcc/rust/resolve/rust-finalize-imports-2.0.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,13 @@ void
6464
GlobbingVisitor::visit_enum_container (AST::Enum &item)
6565
{
6666
for (auto &variant : item.get_variants ())
67-
ctx.insert_globbed (variant->get_identifier (), variant->get_node_id (),
68-
Namespace::Types);
67+
{
68+
ctx.insert_globbed (variant->get_identifier (), variant->get_node_id (),
69+
Namespace::Types);
70+
if (variant->get_enum_item_kind () != AST::EnumItem::Kind::Struct)
71+
ctx.insert_globbed (variant->get_identifier (), variant->get_node_id (),
72+
Namespace::Values);
73+
}
6974
}
7075

7176
void

gcc/rust/resolve/rust-forever-stack.hxx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ ForeverStack<Namespace::Types>::insert_variant (Identifier name, NodeId node)
199199
Rib::Definition::NonShadowable (node, true));
200200
}
201201

202+
template <>
203+
inline tl::expected<NodeId, DuplicateNameError>
204+
ForeverStack<Namespace::Values>::insert_variant (Identifier name, NodeId node)
205+
{
206+
return insert_inner (peek (), name.as_string (),
207+
Rib::Definition::NonShadowable (node, true));
208+
}
209+
202210
template <Namespace N>
203211
inline void
204212
ForeverStack<N>::insert_lang_prelude (Identifier name, NodeId id)

gcc/rust/resolve/rust-name-resolution-context.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,13 @@ NameResolutionContext::insert (Identifier name, NodeId id, Namespace ns)
207207
}
208208

209209
tl::expected<NodeId, DuplicateNameError>
210-
NameResolutionContext::insert_variant (Identifier name, NodeId id)
210+
NameResolutionContext::insert_variant (Identifier name, NodeId id,
211+
bool is_also_value)
211212
{
212-
return types.insert_variant (name, id);
213+
auto res = types.insert_variant (name, id);
214+
if (res.has_value () && is_also_value)
215+
res = values.insert_variant (name, id);
216+
return res;
213217
}
214218

215219
tl::expected<NodeId, DuplicateNameError>

gcc/rust/resolve/rust-name-resolution-context.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,8 @@ class NameResolutionContext
494494
tl::expected<NodeId, DuplicateNameError> insert (Identifier name, NodeId id,
495495
Namespace ns);
496496

497-
tl::expected<NodeId, DuplicateNameError> insert_variant (Identifier name,
498-
NodeId id);
497+
tl::expected<NodeId, DuplicateNameError>
498+
insert_variant (Identifier name, NodeId id, bool is_also_value);
499499

500500
tl::expected<NodeId, DuplicateNameError>
501501
insert_shadowable (Identifier name, NodeId id, Namespace ns);

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ TopLevel::TopLevel (NameResolutionContext &resolver)
3333
template <typename T>
3434
void
3535
TopLevel::insert_enum_variant_or_error_out (const Identifier &identifier,
36-
const T &node)
36+
const T &node, bool is_also_value)
3737
{
3838
insert_enum_variant_or_error_out (identifier, node.get_locus (),
39-
node.get_node_id ());
39+
node.get_node_id (), is_also_value);
4040
}
4141

4242
void
@@ -58,12 +58,13 @@ TopLevel::check_multiple_insertion_error (
5858
void
5959
TopLevel::insert_enum_variant_or_error_out (const Identifier &identifier,
6060
const location_t &locus,
61-
const NodeId node_id)
61+
const NodeId node_id,
62+
bool is_also_value)
6263
{
6364
// keep track of each node's location to provide useful errors
6465
node_locations.emplace (node_id, locus);
6566

66-
auto result = ctx.insert_variant (identifier, node_id);
67+
auto result = ctx.insert_variant (identifier, node_id, is_also_value);
6768
check_multiple_insertion_error (result, identifier, locus, node_id);
6869
}
6970

@@ -309,31 +310,31 @@ TopLevel::visit (AST::TupleStruct &tuple_struct)
309310
void
310311
TopLevel::visit (AST::EnumItem &variant)
311312
{
312-
insert_enum_variant_or_error_out (variant.get_identifier (), variant);
313+
insert_enum_variant_or_error_out (variant.get_identifier (), variant, true);
313314

314315
DefaultResolver::visit (variant);
315316
}
316317

317318
void
318319
TopLevel::visit (AST::EnumItemTuple &variant)
319320
{
320-
insert_enum_variant_or_error_out (variant.get_identifier (), variant);
321+
insert_enum_variant_or_error_out (variant.get_identifier (), variant, true);
321322

322323
DefaultResolver::visit (variant);
323324
}
324325

325326
void
326327
TopLevel::visit (AST::EnumItemStruct &variant)
327328
{
328-
insert_enum_variant_or_error_out (variant.get_identifier (), variant);
329+
insert_enum_variant_or_error_out (variant.get_identifier (), variant, false);
329330

330331
DefaultResolver::visit (variant);
331332
}
332333

333334
void
334335
TopLevel::visit (AST::EnumItemDiscriminant &variant)
335336
{
336-
insert_or_error_out (variant.get_identifier (), variant, Namespace::Types);
337+
insert_enum_variant_or_error_out (variant.get_identifier (), variant, true);
337338

338339
DefaultResolver::visit (variant);
339340
}

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,12 @@ class TopLevel : public DefaultResolver
142142

143143
template <typename T>
144144
void insert_enum_variant_or_error_out (const Identifier &identifier,
145-
const T &node);
145+
const T &node, bool is_also_value);
146146

147147
void insert_enum_variant_or_error_out (const Identifier &identifier,
148148
const location_t &locus,
149-
const NodeId node_id);
149+
const NodeId node_id,
150+
bool is_also_value);
150151

151152
private:
152153
// If a new export has been defined whilst visiting the visitor is considered

gcc/rust/typecheck/rust-hir-type-check-pattern.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
135135
rich_location rich_locus (line_table,
136136
pattern.get_final_segment ().get_locus ());
137137
rich_locus.add_fixit_replace (
138-
"not a unit struct, unit variant or constatnt");
138+
"not a unit struct, unit variant or constant");
139139
rust_error_at (rich_locus, ErrorCode::E0532,
140140
"expected unit struct, unit variant or constant, "
141141
"found %s variant %<%s::%s%>",

0 commit comments

Comments
 (0)