Skip to content

hir: Remove EnumItemDiscriminant from HIR #3698

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
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: 0 additions & 9 deletions gcc/rust/ast/rust-ast-collector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1867,15 +1867,6 @@ TokenCollector::visit (EnumItemStruct &item)
{Rust::Token::make (COMMA, UNDEF_LOCATION)});
}

void
TokenCollector::visit (EnumItemDiscriminant &item)
{
auto id = item.get_identifier ().as_string ();
push (Rust::Token::make_identifier (item.get_locus (), std::move (id)));
push (Rust::Token::make (EQUAL, UNDEF_LOCATION));
visit (item.get_expr ());
}

void
TokenCollector::visit (Enum &enumeration)
{
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/ast/rust-ast-collector.h
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,6 @@ class TokenCollector : public ASTVisitor
void visit (EnumItem &item);
void visit (EnumItemTuple &item);
void visit (EnumItemStruct &item);
void visit (EnumItemDiscriminant &item);
void visit (Enum &enumeration);
void visit (Union &union_item);
void visit (ConstantItem &const_item);
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/ast/rust-ast-full-decls.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ class TupleStruct;
class EnumItem;
class EnumItemTuple;
class EnumItemStruct;
class EnumItemDiscriminant;
class Enum;
class Union;
class ConstantItem;
Expand Down
7 changes: 0 additions & 7 deletions gcc/rust/ast/rust-ast-visitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -911,13 +911,6 @@ DefaultASTVisitor::visit (AST::EnumItemStruct &item)
visit (field);
}

void
DefaultASTVisitor::visit (AST::EnumItemDiscriminant &item)
{
visit (reinterpret_cast<EnumItem &> (item));
visit (item.get_expr ());
}

void
DefaultASTVisitor::visit (AST::Enum &enum_item)
{
Expand Down
2 changes: 0 additions & 2 deletions gcc/rust/ast/rust-ast-visitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ class ASTVisitor
virtual void visit (EnumItem &item) = 0;
virtual void visit (EnumItemTuple &item) = 0;
virtual void visit (EnumItemStruct &item) = 0;
virtual void visit (EnumItemDiscriminant &item) = 0;
virtual void visit (Enum &enum_item) = 0;
virtual void visit (Union &union_item) = 0;
virtual void visit (ConstantItem &const_item) = 0;
Expand Down Expand Up @@ -331,7 +330,6 @@ class DefaultASTVisitor : public ASTVisitor
virtual void visit (AST::EnumItem &item) override;
virtual void visit (AST::EnumItemTuple &item) override;
virtual void visit (AST::EnumItemStruct &item) override;
virtual void visit (AST::EnumItemDiscriminant &item) override;
virtual void visit (AST::Enum &enum_item) override;
virtual void visit (AST::Union &union_item) override;
virtual void visit (AST::ConstantItem &const_item) override;
Expand Down
18 changes: 0 additions & 18 deletions gcc/rust/ast/rust-ast.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2952,18 +2952,6 @@ StructField::as_string () const
return str;
}

std::string
EnumItemDiscriminant::as_string () const
{
// TODO: rewrite to work with non-linearisable exprs
std::string str = EnumItem::as_string ();

// add equal and expression
str += " = " + expression->as_string ();

return str;
}

std::string
ExternalTypeItem::as_string () const
{
Expand Down Expand Up @@ -4749,12 +4737,6 @@ EnumItemStruct::accept_vis (ASTVisitor &vis)
vis.visit (*this);
}

void
EnumItemDiscriminant::accept_vis (ASTVisitor &vis)
{
vis.visit (*this);
}

void
Enum::accept_vis (ASTVisitor &vis)
{
Expand Down
68 changes: 0 additions & 68 deletions gcc/rust/ast/rust-item.h
Original file line number Diff line number Diff line change
Expand Up @@ -2040,8 +2040,6 @@ class EnumItem : public VisItem
// the base EnumItem class
//
// gccrs#3340

Discriminant,
};

virtual ~EnumItem () {}
Expand Down Expand Up @@ -2163,72 +2161,6 @@ class EnumItemStruct : public EnumItem
}
};

// A discriminant (numbered enum) item used in an "enum" tagged union
class EnumItemDiscriminant : public EnumItem
{
std::unique_ptr<Expr> expression;

public:
EnumItemDiscriminant (Identifier variant_name, Visibility vis,
std::unique_ptr<Expr> expr,
std::vector<Attribute> outer_attrs, location_t locus)
: EnumItem (std::move (variant_name), std::move (vis),
std::move (outer_attrs), locus),
expression (std::move (expr))
{}

// Copy constructor with clone
EnumItemDiscriminant (EnumItemDiscriminant const &other)
: EnumItem (other), expression (other.expression->clone_expr ())
{}

// Overloaded assignment operator to clone
EnumItemDiscriminant &operator= (EnumItemDiscriminant const &other)
{
EnumItem::operator= (other);
expression = other.expression->clone_expr ();
// variant_name = other.variant_name;
// outer_attrs = other.outer_attrs;

return *this;
}

// move constructors
EnumItemDiscriminant (EnumItemDiscriminant &&other) = default;
EnumItemDiscriminant &operator= (EnumItemDiscriminant &&other) = default;

EnumItem::Kind get_enum_item_kind () const override
{
return EnumItem::Kind::Discriminant;
}

std::string as_string () const override;

void accept_vis (ASTVisitor &vis) override;

bool has_expr () { return expression != nullptr; }

// TODO: is this better? Or is a "vis_block" better?
Expr &get_expr ()
{
rust_assert (expression != nullptr);
return *expression;
}

std::unique_ptr<Expr> &get_expr_ptr ()
{
rust_assert (expression != nullptr);
return expression;
}

protected:
// Clone function implementation as (not pure) virtual method
EnumItemDiscriminant *clone_item_impl () const override
{
return new EnumItemDiscriminant (*this);
}
};

// AST node for Rust "enum" - tagged union
class Enum : public VisItem
{
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/backend/rust-compile-item.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ class CompileItem : private HIRCompileBase, protected HIR::HIRStmtVisitor
void visit (HIR::EnumItem &) override {}
void visit (HIR::EnumItemTuple &) override {}
void visit (HIR::EnumItemStruct &) override {}
void visit (HIR::EnumItemDiscriminant &) override {}
void visit (HIR::TypePathSegmentFunction &) override {}
void visit (HIR::TypePath &) override {}
void visit (HIR::QualifiedPathInType &) override {}
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/backend/rust-compile-stmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ class CompileStmt : private HIRCompileBase, protected HIR::HIRStmtVisitor
void visit (HIR::EnumItem &) override {}
void visit (HIR::EnumItemTuple &) override {}
void visit (HIR::EnumItemStruct &) override {}
void visit (HIR::EnumItemDiscriminant &) override {}
void visit (HIR::TypePathSegmentFunction &) override {}
void visit (HIR::TypePath &) override {}
void visit (HIR::QualifiedPathInType &) override {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ class ExprStmtBuilder final : public AbstractExprBuilder,
void visit (HIR::EnumItemStruct &a_struct) override {}
void visit (HIR::EnumItem &item) override {}
void visit (HIR::TupleStruct &tuple_struct) override {}
void visit (HIR::EnumItemDiscriminant &discriminant) override {}
void visit (HIR::TypePathSegmentFunction &segment) override {}
void visit (HIR::TypePath &path) override {}
void visit (HIR::QualifiedPathInType &path) override {}
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/borrowck/rust-bir-builder-struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,6 @@ class StructBuilder : public AbstractBuilder, public HIR::HIRFullVisitor
void visit (HIR::EnumItem &item) override { rust_unreachable (); }
void visit (HIR::EnumItemTuple &item) override { rust_unreachable (); }
void visit (HIR::EnumItemStruct &item) override { rust_unreachable (); }
void visit (HIR::EnumItemDiscriminant &item) override { rust_unreachable (); }
void visit (HIR::Enum &enum_item) override { rust_unreachable (); }
void visit (HIR::Union &union_item) override { rust_unreachable (); }
void visit (HIR::ConstantItem &const_item) override { rust_unreachable (); }
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/borrowck/rust-function-collector.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,6 @@ class FunctionCollector : public HIR::HIRFullVisitor
void visit (HIR::EnumItem &item) override {}
void visit (HIR::EnumItemTuple &item) override {}
void visit (HIR::EnumItemStruct &item) override {}
void visit (HIR::EnumItemDiscriminant &item) override {}
void visit (HIR::Enum &enum_item) override {}
void visit (HIR::Union &union_item) override {}
void visit (HIR::ConstantItem &const_item) override {}
Expand Down
4 changes: 0 additions & 4 deletions gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -695,10 +695,6 @@ PrivacyReporter::visit (HIR::EnumItemStruct &)
// TODO: Check the type
}

void
PrivacyReporter::visit (HIR::EnumItemDiscriminant &)
{}

void
PrivacyReporter::visit (HIR::Enum &)
{}
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ types
virtual void visit (HIR::EnumItemStruct &);
virtual void visit (HIR::EnumItem &item);
virtual void visit (HIR::TupleStruct &tuple_struct);
virtual void visit (HIR::EnumItemDiscriminant &);
virtual void visit (HIR::TypePathSegmentFunction &segment);
virtual void visit (HIR::TypePath &path);
virtual void visit (HIR::QualifiedPathInType &path);
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/privacy/rust-reachability.cc
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,6 @@ ReachabilityVisitor::visit (HIR::Enum &enum_item)
}
// Nothing nested to visit in that case
case HIR::EnumItem::Named:
case HIR::EnumItem::Discriminant:
break;
}
}
Expand Down
10 changes: 0 additions & 10 deletions gcc/rust/checks/errors/rust-const-checker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -631,16 +631,6 @@ void
ConstChecker::visit (EnumItemStruct &)
{}

void
ConstChecker::visit (EnumItemDiscriminant &item)
{
const_context.enter (item.get_mappings ().get_hirid ());

item.get_discriminant_expression ().accept_vis (*this);

const_context.exit ();
}

void
ConstChecker::visit (Enum &enum_item)
{
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/rust-const-checker.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@ class ConstChecker : public HIRFullVisitor
virtual void visit (EnumItem &item) override;
virtual void visit (EnumItemTuple &item) override;
virtual void visit (EnumItemStruct &item) override;
virtual void visit (EnumItemDiscriminant &item) override;
virtual void visit (Enum &enum_item) override;
virtual void visit (Union &union_item) override;
virtual void visit (ConstantItem &const_item) override;
Expand Down
4 changes: 0 additions & 4 deletions gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
Original file line number Diff line number Diff line change
Expand Up @@ -495,10 +495,6 @@ void
PatternChecker::visit (EnumItemStruct &)
{}

void
PatternChecker::visit (EnumItemDiscriminant &)
{}

void
PatternChecker::visit (Enum &)
{}
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/rust-hir-pattern-analysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ class PatternChecker : public HIR::HIRFullVisitor
virtual void visit (EnumItem &item) override;
virtual void visit (EnumItemTuple &item) override;
virtual void visit (EnumItemStruct &item) override;
virtual void visit (EnumItemDiscriminant &item) override;
virtual void visit (Enum &enum_item) override;
virtual void visit (Union &union_item) override;
virtual void visit (ConstantItem &const_item) override;
Expand Down
4 changes: 0 additions & 4 deletions gcc/rust/checks/errors/rust-unsafe-checker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -749,10 +749,6 @@ void
UnsafeChecker::visit (EnumItemStruct &)
{}

void
UnsafeChecker::visit (EnumItemDiscriminant &)
{}

void
UnsafeChecker::visit (Enum &)
{}
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/checks/errors/rust-unsafe-checker.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,6 @@ class UnsafeChecker : public HIRFullVisitor
virtual void visit (EnumItem &item) override;
virtual void visit (EnumItemTuple &item) override;
virtual void visit (EnumItemStruct &item) override;
virtual void visit (EnumItemDiscriminant &item) override;
virtual void visit (Enum &enum_item) override;
virtual void visit (Union &union_item) override;
virtual void visit (ConstantItem &const_item) override;
Expand Down
21 changes: 0 additions & 21 deletions gcc/rust/expand/rust-cfg-strip.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1944,27 +1944,6 @@ CfgStrip::visit (AST::EnumItemStruct &item)
maybe_strip_struct_fields (item.get_struct_fields ());
}

void
CfgStrip::visit (AST::EnumItemDiscriminant &item)
{
// initial test based on outer attrs
expand_cfg_attrs (item.get_outer_attrs ());
if (fails_cfg_with_expand (item.get_outer_attrs ()))
{
item.mark_for_strip ();
return;
}

AST::DefaultASTVisitor::visit (item);
/* strip any internal sub-expressions - expression itself isn't
* allowed to have external attributes in this position so can't be
* stripped. */
auto &expr = item.get_expr ();
if (expr.is_marked_for_strip ())
rust_error_at (expr.get_locus (),
"cannot strip expression in this position - outer "
"attributes not allowed");
}
void
CfgStrip::visit (AST::Enum &enum_item)
{
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/expand/rust-cfg-strip.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ class CfgStrip : public AST::DefaultASTVisitor
void visit (AST::EnumItem &item) override;
void visit (AST::EnumItemTuple &item) override;
void visit (AST::EnumItemStruct &item) override;
void visit (AST::EnumItemDiscriminant &item) override;
void visit (AST::Enum &enum_item) override;
void visit (AST::Union &union_item) override;
void visit (AST::ConstantItem &const_item) override;
Expand Down
3 changes: 0 additions & 3 deletions gcc/rust/expand/rust-derive-clone.cc
Original file line number Diff line number Diff line change
Expand Up @@ -322,9 +322,6 @@ DeriveClone::visit_enum (Enum &item)
// Identifiers and discriminated variants are the same for a clone - we
// just return the same variant
case EnumItem::Kind::Identifier:
case EnumItem::Kind::Discriminant:
cases.emplace_back (clone_enum_identifier (path, variant));
break;
case EnumItem::Kind::Tuple:
cases.emplace_back (
clone_enum_tuple (path, static_cast<EnumItemTuple &> (*variant)));
Expand Down
3 changes: 0 additions & 3 deletions gcc/rust/expand/rust-derive-eq.cc
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,6 @@ DeriveEq::visit_enum (Enum &item)
switch (variant->get_enum_item_kind ())
{
case EnumItem::Kind::Identifier:
case EnumItem::Kind::Discriminant:
// nothing to do as they contain no inner types
continue;
case EnumItem::Kind::Tuple: {
auto &tuple = static_cast<EnumItemTuple &> (*variant);

Expand Down
4 changes: 0 additions & 4 deletions gcc/rust/expand/rust-derive-hash.cc
Original file line number Diff line number Diff line change
Expand Up @@ -252,10 +252,6 @@ DeriveHash::visit_enum (Enum &item)
switch (variant->get_enum_item_kind ())
{
case EnumItem::Kind::Identifier:
case EnumItem::Kind::Discriminant:
// nothing to do in these cases, as we just need to hash the
// discriminant value
continue;
case EnumItem::Kind::Tuple:
cases.emplace_back (
match_enum_tuple (variant_path,
Expand Down
3 changes: 0 additions & 3 deletions gcc/rust/expand/rust-derive-partial-eq.cc
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,6 @@ DerivePartialEq::visit_enum (Enum &item)
switch (variant->get_enum_item_kind ())
{
case EnumItem::Kind::Identifier:
case EnumItem::Kind::Discriminant:
cases.emplace_back (match_enum_identifier (variant_path, variant));
break;
case EnumItem::Kind::Tuple:
cases.emplace_back (
match_enum_tuple (variant_path,
Expand Down
1 change: 0 additions & 1 deletion gcc/rust/expand/rust-derive.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ class DeriveVisitor : public AST::ASTVisitor
virtual void visit (EnumItem &item) override final{};
virtual void visit (EnumItemTuple &item) override final{};
virtual void visit (EnumItemStruct &item) override final{};
virtual void visit (EnumItemDiscriminant &item) override final{};
virtual void visit (ConstantItem &const_item) override final{};
virtual void visit (StaticItem &static_item) override final{};
virtual void visit (TraitItemConst &item) override final{};
Expand Down
Loading
Loading