Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions gcc/rust/resolve/rust-finalize-imports-2.0.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,13 @@ void
GlobbingVisitor::visit_enum_container (AST::Enum &item)
{
for (auto &variant : item.get_variants ())
ctx.insert_globbed (variant->get_identifier (), variant->get_node_id (),
Namespace::Types);
{
ctx.insert_globbed (variant->get_identifier (), variant->get_node_id (),
Namespace::Types);
if (variant->get_enum_item_kind () != AST::EnumItem::Kind::Struct)
ctx.insert_globbed (variant->get_identifier (), variant->get_node_id (),
Namespace::Values);
}
}

void
Expand Down
8 changes: 8 additions & 0 deletions gcc/rust/resolve/rust-forever-stack.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,14 @@ ForeverStack<Namespace::Types>::insert_variant (Identifier name, NodeId node)
Rib::Definition::NonShadowable (node, true));
}

template <>
inline tl::expected<NodeId, DuplicateNameError>
ForeverStack<Namespace::Values>::insert_variant (Identifier name, NodeId node)
{
return insert_inner (peek (), name.as_string (),
Rib::Definition::NonShadowable (node, true));
}

template <Namespace N>
inline void
ForeverStack<N>::insert_lang_prelude (Identifier name, NodeId id)
Expand Down
8 changes: 6 additions & 2 deletions gcc/rust/resolve/rust-name-resolution-context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -207,9 +207,13 @@ NameResolutionContext::insert (Identifier name, NodeId id, Namespace ns)
}

tl::expected<NodeId, DuplicateNameError>
NameResolutionContext::insert_variant (Identifier name, NodeId id)
NameResolutionContext::insert_variant (Identifier name, NodeId id,
bool is_also_value)
{
return types.insert_variant (name, id);
auto res = types.insert_variant (name, id);
if (res.has_value () && is_also_value)
res = values.insert_variant (name, id);
return res;
}

tl::expected<NodeId, DuplicateNameError>
Expand Down
4 changes: 2 additions & 2 deletions gcc/rust/resolve/rust-name-resolution-context.h
Original file line number Diff line number Diff line change
Expand Up @@ -494,8 +494,8 @@ class NameResolutionContext
tl::expected<NodeId, DuplicateNameError> insert (Identifier name, NodeId id,
Namespace ns);

tl::expected<NodeId, DuplicateNameError> insert_variant (Identifier name,
NodeId id);
tl::expected<NodeId, DuplicateNameError>
insert_variant (Identifier name, NodeId id, bool is_also_value);

tl::expected<NodeId, DuplicateNameError>
insert_shadowable (Identifier name, NodeId id, Namespace ns);
Expand Down
17 changes: 9 additions & 8 deletions gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ TopLevel::TopLevel (NameResolutionContext &resolver)
template <typename T>
void
TopLevel::insert_enum_variant_or_error_out (const Identifier &identifier,
const T &node)
const T &node, bool is_also_value)
{
insert_enum_variant_or_error_out (identifier, node.get_locus (),
node.get_node_id ());
node.get_node_id (), is_also_value);
}

void
Expand All @@ -58,12 +58,13 @@ TopLevel::check_multiple_insertion_error (
void
TopLevel::insert_enum_variant_or_error_out (const Identifier &identifier,
const location_t &locus,
const NodeId node_id)
const NodeId node_id,
bool is_also_value)
{
// keep track of each node's location to provide useful errors
node_locations.emplace (node_id, locus);

auto result = ctx.insert_variant (identifier, node_id);
auto result = ctx.insert_variant (identifier, node_id, is_also_value);
check_multiple_insertion_error (result, identifier, locus, node_id);
}

Expand Down Expand Up @@ -309,31 +310,31 @@ TopLevel::visit (AST::TupleStruct &tuple_struct)
void
TopLevel::visit (AST::EnumItem &variant)
{
insert_enum_variant_or_error_out (variant.get_identifier (), variant);
insert_enum_variant_or_error_out (variant.get_identifier (), variant, true);

DefaultResolver::visit (variant);
}

void
TopLevel::visit (AST::EnumItemTuple &variant)
{
insert_enum_variant_or_error_out (variant.get_identifier (), variant);
insert_enum_variant_or_error_out (variant.get_identifier (), variant, true);

DefaultResolver::visit (variant);
}

void
TopLevel::visit (AST::EnumItemStruct &variant)
{
insert_enum_variant_or_error_out (variant.get_identifier (), variant);
insert_enum_variant_or_error_out (variant.get_identifier (), variant, false);

DefaultResolver::visit (variant);
}

void
TopLevel::visit (AST::EnumItemDiscriminant &variant)
{
insert_or_error_out (variant.get_identifier (), variant, Namespace::Types);
insert_enum_variant_or_error_out (variant.get_identifier (), variant, true);

DefaultResolver::visit (variant);
}
Expand Down
5 changes: 3 additions & 2 deletions gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,12 @@ class TopLevel : public DefaultResolver

template <typename T>
void insert_enum_variant_or_error_out (const Identifier &identifier,
const T &node);
const T &node, bool is_also_value);

void insert_enum_variant_or_error_out (const Identifier &identifier,
const location_t &locus,
const NodeId node_id);
const NodeId node_id,
bool is_also_value);

private:
// If a new export has been defined whilst visiting the visitor is considered
Expand Down
2 changes: 1 addition & 1 deletion gcc/rust/typecheck/rust-hir-type-check-pattern.cc
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern)
rich_location rich_locus (line_table,
pattern.get_final_segment ().get_locus ());
rich_locus.add_fixit_replace (
"not a unit struct, unit variant or constatnt");
"not a unit struct, unit variant or constant");
rust_error_at (rich_locus, ErrorCode::E0532,
"expected unit struct, unit variant or constant, "
"found %s variant %<%s::%s%>",
Expand Down
Loading