Skip to content

Commit e9ed96b

Browse files
gccrs: Remove EnumItemDiscriminant from AST and related visitors
gcc/rust/ChangeLog: * ast/rust-ast-collector.cc (TokenCollector::visit): Removed. * ast/rust-ast-collector.h (TokenCollector::visit): Removed. * ast/rust-ast-full-decls.h: Removed EnumItemDiscriminant. * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Removed. * ast/rust-ast-visitor.h (ASTVisitor::visit): Removed. * ast/rust-ast.cc (EnumItemDiscriminant::as_string): Removed. * ast/rust-item.h (EnumItemDiscriminant): Removed. * expand/rust-cfg-strip.cc (CfgStrip::visit): Removed. * expand/rust-cfg-strip.h (CfgStrip::visit): Removed. * expand/rust-derive.h (DeriveVisitor::visit): Removed. * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Removed. * expand/rust-expand-visitor.h (ExpandVisitor::visit): Removed. * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Removed. * hir/rust-ast-lower-base.h (ASTLoweringBase::visit): Removed. * hir/rust-ast-lower-enumitem.h (ASTLoweringEnumItem::visit): Removed. * parse/rust-parse-impl.h (Parser::parse_enum_item): Modified EQUAL case to return EnumItemDiscriminant. * resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Removed. * resolve/rust-ast-resolve-base.h (ResolverBase::visit): Removed. * resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Removed. * resolve/rust-ast-resolve-item.h (ResolveItem::visit): Removed. * resolve/rust-ast-resolve-stmt.h (ResolveStmt::visit): Removed. * resolve/rust-ast-resolve-toplevel.h (ResolveTopLevel::visit): Removed. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Removed. * resolve/rust-toplevel-name-resolver-2.0.h (TopLevel::visit): Removed. * util/rust-attributes.cc (AttributeChecker::visit): Removed. * util/rust-attributes.h (AttributeChecker::visit): Removed. Addresses #3340 Signed-off-by: varun-r-mallya <[email protected]>
1 parent 9554470 commit e9ed96b

26 files changed

+8
-234
lines changed

gcc/rust/ast/rust-ast-collector.cc

-9
Original file line numberDiff line numberDiff line change
@@ -1867,15 +1867,6 @@ TokenCollector::visit (EnumItemStruct &item)
18671867
{Rust::Token::make (COMMA, UNDEF_LOCATION)});
18681868
}
18691869

1870-
void
1871-
TokenCollector::visit (EnumItemDiscriminant &item)
1872-
{
1873-
auto id = item.get_identifier ().as_string ();
1874-
push (Rust::Token::make_identifier (item.get_locus (), std::move (id)));
1875-
push (Rust::Token::make (EQUAL, UNDEF_LOCATION));
1876-
visit (item.get_expr ());
1877-
}
1878-
18791870
void
18801871
TokenCollector::visit (Enum &enumeration)
18811872
{

gcc/rust/ast/rust-ast-collector.h

-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,6 @@ class TokenCollector : public ASTVisitor
320320
void visit (EnumItem &item);
321321
void visit (EnumItemTuple &item);
322322
void visit (EnumItemStruct &item);
323-
void visit (EnumItemDiscriminant &item);
324323
void visit (Enum &enumeration);
325324
void visit (Union &union_item);
326325
void visit (ConstantItem &const_item);

gcc/rust/ast/rust-ast-full-decls.h

-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ class TupleStruct;
188188
class EnumItem;
189189
class EnumItemTuple;
190190
class EnumItemStruct;
191-
class EnumItemDiscriminant;
192191
class Enum;
193192
class Union;
194193
class ConstantItem;

gcc/rust/ast/rust-ast-visitor.cc

-7
Original file line numberDiff line numberDiff line change
@@ -911,13 +911,6 @@ DefaultASTVisitor::visit (AST::EnumItemStruct &item)
911911
visit (field);
912912
}
913913

914-
void
915-
DefaultASTVisitor::visit (AST::EnumItemDiscriminant &item)
916-
{
917-
visit (reinterpret_cast<EnumItem &> (item));
918-
visit (item.get_expr ());
919-
}
920-
921914
void
922915
DefaultASTVisitor::visit (AST::Enum &enum_item)
923916
{

gcc/rust/ast/rust-ast-visitor.h

-2
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,6 @@ class ASTVisitor
155155
virtual void visit (EnumItem &item) = 0;
156156
virtual void visit (EnumItemTuple &item) = 0;
157157
virtual void visit (EnumItemStruct &item) = 0;
158-
virtual void visit (EnumItemDiscriminant &item) = 0;
159158
virtual void visit (Enum &enum_item) = 0;
160159
virtual void visit (Union &union_item) = 0;
161160
virtual void visit (ConstantItem &const_item) = 0;
@@ -331,7 +330,6 @@ class DefaultASTVisitor : public ASTVisitor
331330
virtual void visit (AST::EnumItem &item) override;
332331
virtual void visit (AST::EnumItemTuple &item) override;
333332
virtual void visit (AST::EnumItemStruct &item) override;
334-
virtual void visit (AST::EnumItemDiscriminant &item) override;
335333
virtual void visit (AST::Enum &enum_item) override;
336334
virtual void visit (AST::Union &union_item) override;
337335
virtual void visit (AST::ConstantItem &const_item) override;

gcc/rust/ast/rust-ast.cc

-18
Original file line numberDiff line numberDiff line change
@@ -2952,18 +2952,6 @@ StructField::as_string () const
29522952
return str;
29532953
}
29542954

2955-
std::string
2956-
EnumItemDiscriminant::as_string () const
2957-
{
2958-
// TODO: rewrite to work with non-linearisable exprs
2959-
std::string str = EnumItem::as_string ();
2960-
2961-
// add equal and expression
2962-
str += " = " + expression->as_string ();
2963-
2964-
return str;
2965-
}
2966-
29672955
std::string
29682956
ExternalTypeItem::as_string () const
29692957
{
@@ -4749,12 +4737,6 @@ EnumItemStruct::accept_vis (ASTVisitor &vis)
47494737
vis.visit (*this);
47504738
}
47514739

4752-
void
4753-
EnumItemDiscriminant::accept_vis (ASTVisitor &vis)
4754-
{
4755-
vis.visit (*this);
4756-
}
4757-
47584740
void
47594741
Enum::accept_vis (ASTVisitor &vis)
47604742
{

gcc/rust/ast/rust-item.h

-66
Original file line numberDiff line numberDiff line change
@@ -2163,72 +2163,6 @@ class EnumItemStruct : public EnumItem
21632163
}
21642164
};
21652165

2166-
// A discriminant (numbered enum) item used in an "enum" tagged union
2167-
class EnumItemDiscriminant : public EnumItem
2168-
{
2169-
std::unique_ptr<Expr> expression;
2170-
2171-
public:
2172-
EnumItemDiscriminant (Identifier variant_name, Visibility vis,
2173-
std::unique_ptr<Expr> expr,
2174-
std::vector<Attribute> outer_attrs, location_t locus)
2175-
: EnumItem (std::move (variant_name), std::move (vis),
2176-
std::move (outer_attrs), locus),
2177-
expression (std::move (expr))
2178-
{}
2179-
2180-
// Copy constructor with clone
2181-
EnumItemDiscriminant (EnumItemDiscriminant const &other)
2182-
: EnumItem (other), expression (other.expression->clone_expr ())
2183-
{}
2184-
2185-
// Overloaded assignment operator to clone
2186-
EnumItemDiscriminant &operator= (EnumItemDiscriminant const &other)
2187-
{
2188-
EnumItem::operator= (other);
2189-
expression = other.expression->clone_expr ();
2190-
// variant_name = other.variant_name;
2191-
// outer_attrs = other.outer_attrs;
2192-
2193-
return *this;
2194-
}
2195-
2196-
// move constructors
2197-
EnumItemDiscriminant (EnumItemDiscriminant &&other) = default;
2198-
EnumItemDiscriminant &operator= (EnumItemDiscriminant &&other) = default;
2199-
2200-
EnumItem::Kind get_enum_item_kind () const override
2201-
{
2202-
return EnumItem::Kind::Discriminant;
2203-
}
2204-
2205-
std::string as_string () const override;
2206-
2207-
void accept_vis (ASTVisitor &vis) override;
2208-
2209-
bool has_expr () { return expression != nullptr; }
2210-
2211-
// TODO: is this better? Or is a "vis_block" better?
2212-
Expr &get_expr ()
2213-
{
2214-
rust_assert (expression != nullptr);
2215-
return *expression;
2216-
}
2217-
2218-
std::unique_ptr<Expr> &get_expr_ptr ()
2219-
{
2220-
rust_assert (expression != nullptr);
2221-
return expression;
2222-
}
2223-
2224-
protected:
2225-
// Clone function implementation as (not pure) virtual method
2226-
EnumItemDiscriminant *clone_item_impl () const override
2227-
{
2228-
return new EnumItemDiscriminant (*this);
2229-
}
2230-
};
2231-
22322166
// AST node for Rust "enum" - tagged union
22332167
class Enum : public VisItem
22342168
{

gcc/rust/expand/rust-cfg-strip.cc

-21
Original file line numberDiff line numberDiff line change
@@ -1944,27 +1944,6 @@ CfgStrip::visit (AST::EnumItemStruct &item)
19441944
maybe_strip_struct_fields (item.get_struct_fields ());
19451945
}
19461946

1947-
void
1948-
CfgStrip::visit (AST::EnumItemDiscriminant &item)
1949-
{
1950-
// initial test based on outer attrs
1951-
expand_cfg_attrs (item.get_outer_attrs ());
1952-
if (fails_cfg_with_expand (item.get_outer_attrs ()))
1953-
{
1954-
item.mark_for_strip ();
1955-
return;
1956-
}
1957-
1958-
AST::DefaultASTVisitor::visit (item);
1959-
/* strip any internal sub-expressions - expression itself isn't
1960-
* allowed to have external attributes in this position so can't be
1961-
* stripped. */
1962-
auto &expr = item.get_expr ();
1963-
if (expr.is_marked_for_strip ())
1964-
rust_error_at (expr.get_locus (),
1965-
"cannot strip expression in this position - outer "
1966-
"attributes not allowed");
1967-
}
19681947
void
19691948
CfgStrip::visit (AST::Enum &enum_item)
19701949
{

gcc/rust/expand/rust-cfg-strip.h

-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ class CfgStrip : public AST::DefaultASTVisitor
142142
void visit (AST::EnumItem &item) override;
143143
void visit (AST::EnumItemTuple &item) override;
144144
void visit (AST::EnumItemStruct &item) override;
145-
void visit (AST::EnumItemDiscriminant &item) override;
146145
void visit (AST::Enum &enum_item) override;
147146
void visit (AST::Union &union_item) override;
148147
void visit (AST::ConstantItem &const_item) override;

gcc/rust/expand/rust-derive.h

-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ class DeriveVisitor : public AST::ASTVisitor
185185
virtual void visit (EnumItem &item) override final{};
186186
virtual void visit (EnumItemTuple &item) override final{};
187187
virtual void visit (EnumItemStruct &item) override final{};
188-
virtual void visit (EnumItemDiscriminant &item) override final{};
189188
virtual void visit (ConstantItem &const_item) override final{};
190189
virtual void visit (StaticItem &static_item) override final{};
191190
virtual void visit (TraitItemConst &item) override final{};

gcc/rust/expand/rust-expand-visitor.cc

-6
Original file line numberDiff line numberDiff line change
@@ -810,12 +810,6 @@ ExpandVisitor::visit (AST::EnumItemStruct &item)
810810
expand_struct_fields (item.get_struct_fields ());
811811
}
812812

813-
void
814-
ExpandVisitor::visit (AST::EnumItemDiscriminant &item)
815-
{
816-
maybe_expand_expr (item.get_expr_ptr ());
817-
}
818-
819813
void
820814
ExpandVisitor::visit (AST::Union &union_item)
821815
{

gcc/rust/expand/rust-expand-visitor.h

-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ class ExpandVisitor : public AST::DefaultASTVisitor
249249
void visit (AST::EnumItem &item) override;
250250
void visit (AST::EnumItemTuple &item) override;
251251
void visit (AST::EnumItemStruct &item) override;
252-
void visit (AST::EnumItemDiscriminant &item) override;
253252
void visit (AST::Union &union_item) override;
254253
void visit (AST::ConstantItem &const_item) override;
255254
void visit (AST::StaticItem &static_item) override;

gcc/rust/hir/rust-ast-lower-base.cc

-3
Original file line numberDiff line numberDiff line change
@@ -332,9 +332,6 @@ void
332332
ASTLoweringBase::visit (AST::EnumItemStruct &)
333333
{}
334334
void
335-
ASTLoweringBase::visit (AST::EnumItemDiscriminant &)
336-
{}
337-
void
338335
ASTLoweringBase::visit (AST::Enum &)
339336
{}
340337
void

gcc/rust/hir/rust-ast-lower-base.h

-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ class ASTLoweringBase : public AST::ASTVisitor
178178
virtual void visit (AST::EnumItem &item) override;
179179
virtual void visit (AST::EnumItemTuple &item) override;
180180
virtual void visit (AST::EnumItemStruct &item) override;
181-
virtual void visit (AST::EnumItemDiscriminant &item) override;
182181
virtual void visit (AST::Enum &enum_item) override;
183182
virtual void visit (AST::Union &union_item) override;
184183
virtual void visit (AST::ConstantItem &const_item) override;

gcc/rust/hir/rust-ast-lower-enumitem.h

-20
Original file line numberDiff line numberDiff line change
@@ -144,26 +144,6 @@ class ASTLoweringEnumItem : public ASTLoweringBase
144144
item.get_locus ());
145145
}
146146

147-
void visit (AST::EnumItemDiscriminant &item) override
148-
{
149-
auto crate_num = mappings.get_current_crate ();
150-
Analysis::NodeMapping mapping (crate_num, item.get_node_id (),
151-
mappings.get_next_hir_id (crate_num),
152-
mappings.get_next_localdef_id (crate_num));
153-
154-
if (item.has_visibility ())
155-
rust_error_at (item.get_locus (),
156-
"visibility qualifier %qs not allowed on enum item",
157-
item.get_visibility ().as_string ().c_str ());
158-
159-
HIR::Expr *expr = ASTLoweringExpr::translate (item.get_expr ());
160-
translated
161-
= new HIR::EnumItemDiscriminant (mapping, item.get_identifier (),
162-
std::unique_ptr<HIR::Expr> (expr),
163-
item.get_outer_attrs (),
164-
item.get_locus ());
165-
}
166-
167147
private:
168148
ASTLoweringEnumItem () : translated (nullptr) {}
169149

gcc/rust/parse/rust-parse-impl.h

+8-5
Original file line numberDiff line numberDiff line change
@@ -4792,12 +4792,15 @@ Parser<ManagedTokenSource>::parse_enum_item ()
47924792

47934793
std::unique_ptr<AST::Expr> discriminant_expr = parse_expr ();
47944794

4795-
return std::unique_ptr<AST::EnumItemDiscriminant> (
4796-
new AST::EnumItemDiscriminant (std::move (item_name), std::move (vis),
4797-
std::move (discriminant_expr),
4798-
std::move (outer_attrs),
4799-
item_name_tok->get_locus ()));
4795+
// FIXME: We need to add special handling for parsing discriminant
4796+
// expressions for all possible enum items, not just enum item
4797+
// identifiers (gccrs#3340)
4798+
return std::unique_ptr<AST::EnumItem> (
4799+
new AST::EnumItem (std::move (item_name), std::move (vis),
4800+
std::move (outer_attrs),
4801+
item_name_tok->get_locus ()));
48004802
}
4803+
48014804
default:
48024805
// regular enum with just an identifier
48034806
return std::unique_ptr<AST::EnumItem> (

gcc/rust/resolve/rust-ast-resolve-base.cc

-4
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,6 @@ void
391391
ResolverBase::visit (AST::EnumItemStruct &)
392392
{}
393393

394-
void
395-
ResolverBase::visit (AST::EnumItemDiscriminant &)
396-
{}
397-
398394
void
399395
ResolverBase::visit (AST::Enum &)
400396
{}

gcc/rust/resolve/rust-ast-resolve-base.h

-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ class ResolverBase : public AST::ASTVisitor
129129
void visit (AST::EnumItem &);
130130
void visit (AST::EnumItemTuple &);
131131
void visit (AST::EnumItemStruct &);
132-
void visit (AST::EnumItemDiscriminant &);
133132
void visit (AST::Enum &);
134133
void visit (AST::Union &);
135134
void visit (AST::ConstantItem &);

gcc/rust/resolve/rust-ast-resolve-item.cc

-11
Original file line numberDiff line numberDiff line change
@@ -347,17 +347,6 @@ ResolveItem::visit (AST::EnumItemStruct &item)
347347
}
348348
}
349349

350-
void
351-
ResolveItem::visit (AST::EnumItemDiscriminant &item)
352-
{
353-
auto decl = CanonicalPath::new_seg (item.get_node_id (),
354-
item.get_identifier ().as_string ());
355-
auto path = prefix.append (decl);
356-
auto cpath = canonical_prefix.append (decl);
357-
358-
mappings.insert_canonical_path (item.get_node_id (), cpath);
359-
}
360-
361350
void
362351
ResolveItem::visit (AST::StructStruct &struct_decl)
363352
{

gcc/rust/resolve/rust-ast-resolve-item.h

-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class ResolveItem : public ResolverBase
6363
void visit (AST::EnumItem &item) override;
6464
void visit (AST::EnumItemTuple &item) override;
6565
void visit (AST::EnumItemStruct &item) override;
66-
void visit (AST::EnumItemDiscriminant &item) override;
6766
void visit (AST::StructStruct &struct_decl) override;
6867
void visit (AST::Union &union_decl) override;
6968
void visit (AST::StaticItem &var) override;

gcc/rust/resolve/rust-ast-resolve-stmt.h

-20
Original file line numberDiff line numberDiff line change
@@ -217,26 +217,6 @@ class ResolveStmt : public ResolverBase
217217
}
218218
}
219219

220-
void visit (AST::EnumItemDiscriminant &item) override
221-
{
222-
auto decl = enum_prefix.append (
223-
CanonicalPath::new_seg (item.get_node_id (),
224-
item.get_identifier ().as_string ()));
225-
auto path = decl; // this ensures we have the correct relative resolution
226-
auto cpath = canonical_prefix.append (decl);
227-
mappings.insert_canonical_path (item.get_node_id (), cpath);
228-
229-
resolver->get_type_scope ().insert (
230-
path, item.get_node_id (), item.get_locus (), false, Rib::ItemType::Type,
231-
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
232-
rich_location r (line_table, item.get_locus ());
233-
r.add_range (locus);
234-
redefined_error (r);
235-
});
236-
237-
// Done, no fields.
238-
}
239-
240220
void visit (AST::StructStruct &struct_decl) override
241221
{
242222
auto decl

gcc/rust/resolve/rust-ast-resolve-toplevel.h

-22
Original file line numberDiff line numberDiff line change
@@ -212,28 +212,6 @@ class ResolveTopLevel : public ResolverBase
212212
mappings.insert_module_child (current_module, item.get_node_id ());
213213
}
214214

215-
void visit (AST::EnumItemDiscriminant &item) override
216-
{
217-
auto decl = CanonicalPath::new_seg (item.get_node_id (),
218-
item.get_identifier ().as_string ());
219-
auto path = prefix.append (decl);
220-
auto cpath = canonical_prefix.append (decl);
221-
222-
resolver->get_type_scope ().insert (
223-
path, item.get_node_id (), item.get_locus (), false, Rib::ItemType::Type,
224-
[&] (const CanonicalPath &, NodeId, location_t locus) -> void {
225-
rich_location r (line_table, item.get_locus ());
226-
r.add_range (locus);
227-
redefined_error (r);
228-
});
229-
230-
mappings.insert_canonical_path (item.get_node_id (), cpath);
231-
232-
NodeId current_module = resolver->peek_current_module_scope ();
233-
mappings.insert_module_child_item (current_module, decl);
234-
mappings.insert_module_child (current_module, item.get_node_id ());
235-
}
236-
237215
void visit (AST::StructStruct &struct_decl) override
238216
{
239217
auto decl

0 commit comments

Comments
 (0)