Skip to content

Commit ed1a4dc

Browse files
bors[bot]dkm
andauthored
Merge #954
954: HIR Visitor refactoring r=philberty a=dkm This change split the single HIR visitor in smaller abstract ones: - Stmt - VisItem - Pattern - ExternalItem - Impl - Type - Expression Instead of providing a Base class with empty visit() methods, they are kept abstract to avoid the case where a missing visit() is silently ignored: implementors must explicitely override all visit. There is also a FullVisitor that covers all HIR nodes and also provides a Base class with empty behavior. fixes #825 Signed-off-by: Marc Poulhiès <dkm@kataplop.net> Co-authored-by: Marc Poulhiès <dkm@kataplop.net>
2 parents b695eb8 + dffb1ad commit ed1a4dc

22 files changed

+1485
-94
lines changed

gcc/rust/backend/rust-compile-base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// Copyright (C) 2020-2022 Free Software Foundation, Inc.
2+
13
// This file is part of GCC.
24

35
// GCC is free software; you can redistribute it and/or modify it under
@@ -25,7 +27,7 @@
2527
namespace Rust {
2628
namespace Compile {
2729

28-
class HIRCompileBase : public HIR::HIRFullVisitorBase
30+
class HIRCompileBase
2931
{
3032
public:
3133
virtual ~HIRCompileBase () {}

gcc/rust/backend/rust-compile-block.h

Lines changed: 169 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@
2525
namespace Rust {
2626
namespace Compile {
2727

28-
class CompileBlock : public HIRCompileBase
28+
class CompileBlock : public HIRCompileBase, public HIR::HIRExpressionVisitor
2929
{
30-
using Rust::Compile::HIRCompileBase::visit;
31-
3230
public:
3331
static tree compile (HIR::BlockExpr *expr, Context *ctx, Bvariable *result)
3432
{
@@ -39,6 +37,62 @@ class CompileBlock : public HIRCompileBase
3937

4038
void visit (HIR::BlockExpr &expr) override;
4139

40+
// Empty visit for unused Expression HIR nodes.
41+
void visit (HIR::PathInExpression &) override {}
42+
void visit (HIR::QualifiedPathInExpression &) override {}
43+
void visit (HIR::ClosureExprInner &) override {}
44+
void visit (HIR::ClosureExprInnerTyped &) override {}
45+
void visit (HIR::StructExprFieldIdentifier &) override {}
46+
void visit (HIR::StructExprFieldIdentifierValue &) override {}
47+
void visit (HIR::StructExprFieldIndexValue &) override {}
48+
void visit (HIR::StructExprStruct &) override {}
49+
void visit (HIR::StructExprStructFields &) override {}
50+
void visit (HIR::IdentifierExpr &) override {}
51+
void visit (HIR::LiteralExpr &) override {}
52+
void visit (HIR::BorrowExpr &) override {}
53+
void visit (HIR::DereferenceExpr &) override {}
54+
void visit (HIR::ErrorPropagationExpr &) override {}
55+
void visit (HIR::NegationExpr &) override {}
56+
void visit (HIR::ArithmeticOrLogicalExpr &) override {}
57+
void visit (HIR::ComparisonExpr &) override {}
58+
void visit (HIR::LazyBooleanExpr &) override {}
59+
void visit (HIR::TypeCastExpr &) override {}
60+
void visit (HIR::AssignmentExpr &) override {}
61+
void visit (HIR::CompoundAssignmentExpr &) override {}
62+
void visit (HIR::GroupedExpr &) override {}
63+
void visit (HIR::ArrayExpr &) override {}
64+
void visit (HIR::ArrayIndexExpr &) override {}
65+
void visit (HIR::TupleExpr &) override {}
66+
void visit (HIR::TupleIndexExpr &) override {}
67+
void visit (HIR::CallExpr &) override {}
68+
void visit (HIR::MethodCallExpr &) override {}
69+
void visit (HIR::FieldAccessExpr &) override {}
70+
void visit (HIR::ContinueExpr &) override {}
71+
void visit (HIR::BreakExpr &) override {}
72+
void visit (HIR::RangeFromToExpr &) override {}
73+
void visit (HIR::RangeFromExpr &) override {}
74+
void visit (HIR::RangeToExpr &) override {}
75+
void visit (HIR::RangeFullExpr &) override {}
76+
void visit (HIR::RangeFromToInclExpr &) override {}
77+
void visit (HIR::RangeToInclExpr &) override {}
78+
void visit (HIR::ReturnExpr &) override {}
79+
void visit (HIR::UnsafeBlockExpr &) override {}
80+
void visit (HIR::LoopExpr &) override {}
81+
void visit (HIR::WhileLoopExpr &) override {}
82+
void visit (HIR::WhileLetLoopExpr &) override {}
83+
void visit (HIR::ForLoopExpr &) override {}
84+
void visit (HIR::IfExpr &) override {}
85+
void visit (HIR::IfExprConseqElse &) override {}
86+
void visit (HIR::IfExprConseqIf &) override {}
87+
void visit (HIR::IfExprConseqIfLet &) override {}
88+
void visit (HIR::IfLetExpr &) override {}
89+
void visit (HIR::IfLetExprConseqElse &) override {}
90+
void visit (HIR::IfLetExprConseqIf &) override {}
91+
void visit (HIR::IfLetExprConseqIfLet &) override {}
92+
void visit (HIR::MatchExpr &) override {}
93+
void visit (HIR::AwaitExpr &) override {}
94+
void visit (HIR::AsyncBlockExpr &) override {}
95+
4296
private:
4397
CompileBlock (Context *ctx, Bvariable *result)
4498
: HIRCompileBase (ctx), translated (nullptr), result (result)
@@ -48,10 +102,9 @@ class CompileBlock : public HIRCompileBase
48102
Bvariable *result;
49103
};
50104

51-
class CompileConditionalBlocks : public HIRCompileBase
105+
class CompileConditionalBlocks : public HIRCompileBase,
106+
public HIR::HIRExpressionVisitor
52107
{
53-
using Rust::Compile::HIRCompileBase::visit;
54-
55108
public:
56109
static tree compile (HIR::IfExpr *expr, Context *ctx, Bvariable *result)
57110
{
@@ -61,11 +114,63 @@ class CompileConditionalBlocks : public HIRCompileBase
61114
}
62115

63116
void visit (HIR::IfExpr &expr) override;
64-
65117
void visit (HIR::IfExprConseqElse &expr) override;
66-
67118
void visit (HIR::IfExprConseqIf &expr) override;
68119

120+
// Empty visit for unused Expression HIR nodes.
121+
void visit (HIR::PathInExpression &) override {}
122+
void visit (HIR::QualifiedPathInExpression &) override {}
123+
void visit (HIR::ClosureExprInner &) override {}
124+
void visit (HIR::ClosureExprInnerTyped &) override {}
125+
void visit (HIR::StructExprFieldIdentifier &) override {}
126+
void visit (HIR::StructExprFieldIdentifierValue &) override {}
127+
void visit (HIR::StructExprFieldIndexValue &) override {}
128+
void visit (HIR::StructExprStruct &) override {}
129+
void visit (HIR::StructExprStructFields &) override {}
130+
void visit (HIR::IdentifierExpr &) override {}
131+
void visit (HIR::LiteralExpr &) override {}
132+
void visit (HIR::BorrowExpr &) override {}
133+
void visit (HIR::DereferenceExpr &) override {}
134+
void visit (HIR::ErrorPropagationExpr &) override {}
135+
void visit (HIR::NegationExpr &) override {}
136+
void visit (HIR::ArithmeticOrLogicalExpr &) override {}
137+
void visit (HIR::ComparisonExpr &) override {}
138+
void visit (HIR::LazyBooleanExpr &) override {}
139+
void visit (HIR::TypeCastExpr &) override {}
140+
void visit (HIR::AssignmentExpr &) override {}
141+
void visit (HIR::CompoundAssignmentExpr &) override {}
142+
void visit (HIR::GroupedExpr &) override {}
143+
void visit (HIR::ArrayExpr &) override {}
144+
void visit (HIR::ArrayIndexExpr &) override {}
145+
void visit (HIR::TupleExpr &) override {}
146+
void visit (HIR::TupleIndexExpr &) override {}
147+
void visit (HIR::CallExpr &) override {}
148+
void visit (HIR::MethodCallExpr &) override {}
149+
void visit (HIR::FieldAccessExpr &) override {}
150+
void visit (HIR::BlockExpr &) override {}
151+
void visit (HIR::ContinueExpr &) override {}
152+
void visit (HIR::BreakExpr &) override {}
153+
void visit (HIR::RangeFromToExpr &) override {}
154+
void visit (HIR::RangeFromExpr &) override {}
155+
void visit (HIR::RangeToExpr &) override {}
156+
void visit (HIR::RangeFullExpr &) override {}
157+
void visit (HIR::RangeFromToInclExpr &) override {}
158+
void visit (HIR::RangeToInclExpr &) override {}
159+
void visit (HIR::ReturnExpr &) override {}
160+
void visit (HIR::UnsafeBlockExpr &) override {}
161+
void visit (HIR::LoopExpr &) override {}
162+
void visit (HIR::WhileLoopExpr &) override {}
163+
void visit (HIR::WhileLetLoopExpr &) override {}
164+
void visit (HIR::ForLoopExpr &) override {}
165+
void visit (HIR::IfExprConseqIfLet &) override {}
166+
void visit (HIR::IfLetExpr &) override {}
167+
void visit (HIR::IfLetExprConseqElse &) override {}
168+
void visit (HIR::IfLetExprConseqIf &) override {}
169+
void visit (HIR::IfLetExprConseqIfLet &) override {}
170+
void visit (HIR::MatchExpr &) override {}
171+
void visit (HIR::AwaitExpr &) override {}
172+
void visit (HIR::AsyncBlockExpr &) override {}
173+
69174
private:
70175
CompileConditionalBlocks (Context *ctx, Bvariable *result)
71176
: HIRCompileBase (ctx), translated (nullptr), result (result)
@@ -75,10 +180,9 @@ class CompileConditionalBlocks : public HIRCompileBase
75180
Bvariable *result;
76181
};
77182

78-
class CompileExprWithBlock : public HIRCompileBase
183+
class CompileExprWithBlock : public HIRCompileBase,
184+
public HIR::HIRExpressionVisitor
79185
{
80-
using Rust::Compile::HIRCompileBase::visit;
81-
82186
public:
83187
static tree compile (HIR::ExprWithBlock *expr, Context *ctx,
84188
Bvariable *result)
@@ -103,6 +207,60 @@ class CompileExprWithBlock : public HIRCompileBase
103207
translated = CompileConditionalBlocks::compile (&expr, ctx, result);
104208
}
105209

210+
// Empty visit for unused Expression HIR nodes.
211+
void visit (HIR::PathInExpression &) override {}
212+
void visit (HIR::QualifiedPathInExpression &) override {}
213+
void visit (HIR::ClosureExprInner &) override {}
214+
void visit (HIR::ClosureExprInnerTyped &) override {}
215+
void visit (HIR::StructExprFieldIdentifier &) override {}
216+
void visit (HIR::StructExprFieldIdentifierValue &) override {}
217+
void visit (HIR::StructExprFieldIndexValue &) override {}
218+
void visit (HIR::StructExprStruct &) override {}
219+
void visit (HIR::StructExprStructFields &) override {}
220+
void visit (HIR::IdentifierExpr &) override {}
221+
void visit (HIR::LiteralExpr &) override {}
222+
void visit (HIR::BorrowExpr &) override {}
223+
void visit (HIR::DereferenceExpr &) override {}
224+
void visit (HIR::ErrorPropagationExpr &) override {}
225+
void visit (HIR::NegationExpr &) override {}
226+
void visit (HIR::ArithmeticOrLogicalExpr &) override {}
227+
void visit (HIR::ComparisonExpr &) override {}
228+
void visit (HIR::LazyBooleanExpr &) override {}
229+
void visit (HIR::TypeCastExpr &) override {}
230+
void visit (HIR::AssignmentExpr &) override {}
231+
void visit (HIR::CompoundAssignmentExpr &) override {}
232+
void visit (HIR::GroupedExpr &) override {}
233+
void visit (HIR::ArrayExpr &) override {}
234+
void visit (HIR::ArrayIndexExpr &) override {}
235+
void visit (HIR::TupleExpr &) override {}
236+
void visit (HIR::TupleIndexExpr &) override {}
237+
void visit (HIR::CallExpr &) override {}
238+
void visit (HIR::MethodCallExpr &) override {}
239+
void visit (HIR::FieldAccessExpr &) override {}
240+
void visit (HIR::BlockExpr &) override {}
241+
void visit (HIR::ContinueExpr &) override {}
242+
void visit (HIR::BreakExpr &) override {}
243+
void visit (HIR::RangeFromToExpr &) override {}
244+
void visit (HIR::RangeFromExpr &) override {}
245+
void visit (HIR::RangeToExpr &) override {}
246+
void visit (HIR::RangeFullExpr &) override {}
247+
void visit (HIR::RangeFromToInclExpr &) override {}
248+
void visit (HIR::RangeToInclExpr &) override {}
249+
void visit (HIR::ReturnExpr &) override {}
250+
void visit (HIR::UnsafeBlockExpr &) override {}
251+
void visit (HIR::LoopExpr &) override {}
252+
void visit (HIR::WhileLoopExpr &) override {}
253+
void visit (HIR::WhileLetLoopExpr &) override {}
254+
void visit (HIR::ForLoopExpr &) override {}
255+
void visit (HIR::IfExprConseqIfLet &) override {}
256+
void visit (HIR::IfLetExpr &) override {}
257+
void visit (HIR::IfLetExprConseqElse &) override {}
258+
void visit (HIR::IfLetExprConseqIf &) override {}
259+
void visit (HIR::IfLetExprConseqIfLet &) override {}
260+
void visit (HIR::MatchExpr &) override {}
261+
void visit (HIR::AwaitExpr &) override {}
262+
void visit (HIR::AsyncBlockExpr &) override {}
263+
106264
private:
107265
CompileExprWithBlock (Context *ctx, Bvariable *result)
108266
: HIRCompileBase (ctx), translated (nullptr), result (result)

gcc/rust/backend/rust-compile-expr.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,8 @@
2929
namespace Rust {
3030
namespace Compile {
3131

32-
class CompileExpr : public HIRCompileBase
32+
class CompileExpr : public HIRCompileBase, public HIR::HIRExpressionVisitor
3333
{
34-
using Rust::Compile::HIRCompileBase::visit;
35-
3634
public:
3735
static tree Compile (HIR::Expr *expr, Context *ctx)
3836
{
@@ -769,9 +767,7 @@ class CompileExpr : public HIRCompileBase
769767
}
770768

771769
void visit (HIR::BorrowExpr &expr) override;
772-
773770
void visit (HIR::DereferenceExpr &expr) override;
774-
775771
void visit (HIR::MatchExpr &expr) override;
776772

777773
void visit (HIR::RangeFromToExpr &expr) override;
@@ -784,6 +780,24 @@ class CompileExpr : public HIRCompileBase
784780

785781
void visit (HIR::RangeFromToInclExpr &expr) override;
786782

783+
// Empty visit for unused Expression HIR nodes.
784+
void visit (HIR::ClosureExprInner &) override {}
785+
void visit (HIR::ClosureExprInnerTyped &) override {}
786+
void visit (HIR::StructExprFieldIdentifier &) override {}
787+
void visit (HIR::StructExprFieldIdentifierValue &) override {}
788+
void visit (HIR::StructExprFieldIndexValue &) override {}
789+
void visit (HIR::ErrorPropagationExpr &) override {}
790+
void visit (HIR::RangeToInclExpr &) override {}
791+
void visit (HIR::WhileLetLoopExpr &) override {}
792+
void visit (HIR::ForLoopExpr &) override {}
793+
void visit (HIR::IfExprConseqIfLet &) override {}
794+
void visit (HIR::IfLetExpr &) override {}
795+
void visit (HIR::IfLetExprConseqElse &) override {}
796+
void visit (HIR::IfLetExprConseqIf &) override {}
797+
void visit (HIR::IfLetExprConseqIfLet &) override {}
798+
void visit (HIR::AwaitExpr &) override {}
799+
void visit (HIR::AsyncBlockExpr &) override {}
800+
787801
protected:
788802
tree compile_dyn_dispatch_call (const TyTy::DynamicObjectType *dyn,
789803
TyTy::BaseType *receiver,

gcc/rust/backend/rust-compile-extern.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@
2525
namespace Rust {
2626
namespace Compile {
2727

28-
class CompileExternItem : public HIRCompileBase
28+
class CompileExternItem : public HIRCompileBase,
29+
public HIR::HIRExternalItemVisitor
2930
{
30-
using Rust::Compile::HIRCompileBase::visit;
31-
3231
public:
3332
static void compile (HIR::ExternalItem *item, Context *ctx,
3433
TyTy::BaseType *concrete = nullptr)

gcc/rust/backend/rust-compile-fnparam.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@
2424
namespace Rust {
2525
namespace Compile {
2626

27-
class CompileFnParam : public HIRCompileBase
27+
class CompileFnParam : public HIRCompileBase, public HIR::HIRPatternVisitor
2828
{
29-
using Rust::Compile::HIRCompileBase::visit;
30-
3129
public:
3230
static Bvariable *compile (Context *ctx, tree fndecl,
3331
HIR::FunctionParam *param, tree decl_type,
@@ -57,6 +55,18 @@ class CompileFnParam : public HIRCompileBase
5755
= ctx->get_backend ()->parameter_variable (fndecl, "_", decl_type, locus);
5856
}
5957

58+
// Empty visit for unused Pattern HIR nodes.
59+
void visit (HIR::GroupedPattern &) override {}
60+
void visit (HIR::LiteralPattern &) override {}
61+
void visit (HIR::PathInExpression &) override {}
62+
void visit (HIR::QualifiedPathInExpression &) override {}
63+
void visit (HIR::RangePattern &) override {}
64+
void visit (HIR::ReferencePattern &) override {}
65+
void visit (HIR::SlicePattern &) override {}
66+
void visit (HIR::StructPattern &) override {}
67+
void visit (HIR::TuplePattern &) override {}
68+
void visit (HIR::TupleStructPattern &) override {}
69+
6070
private:
6171
CompileFnParam (Context *ctx, tree fndecl, tree decl_type, Location locus)
6272
: HIRCompileBase (ctx), fndecl (fndecl), decl_type (decl_type),
@@ -69,7 +79,7 @@ class CompileFnParam : public HIRCompileBase
6979
Bvariable *compiled_param;
7080
};
7181

72-
class CompileSelfParam : public HIRCompileBase
82+
class CompileSelfParam : public HIRCompileBase, public HIR::HIRStmtVisitor
7383
{
7484
public:
7585
static Bvariable *compile (Context *ctx, tree fndecl, HIR::SelfParam &self,

gcc/rust/backend/rust-compile-implitem.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ namespace Compile {
2929
// this is a proxy for HIR::ImplItem's back to use the normel HIR::Item path
3030
class CompileInherentImplItem : public CompileItem
3131
{
32-
using Rust::Compile::CompileItem::visit;
33-
3432
public:
3533
static tree Compile (HIR::ImplItem *item, Context *ctx,
3634
TyTy::BaseType *concrete = nullptr,
@@ -54,10 +52,8 @@ class CompileInherentImplItem : public CompileItem
5452
{}
5553
};
5654

57-
class CompileTraitItem : public HIRCompileBase
55+
class CompileTraitItem : public HIRCompileBase, public HIR::HIRTraitItemVisitor
5856
{
59-
using Rust::Compile::HIRCompileBase::visit;
60-
6157
public:
6258
static tree Compile (HIR::TraitItem *item, Context *ctx,
6359
TyTy::BaseType *concrete, bool is_query_mode = false,
@@ -74,9 +70,10 @@ class CompileTraitItem : public HIRCompileBase
7470
}
7571

7672
void visit (HIR::TraitItemConst &constant) override;
77-
7873
void visit (HIR::TraitItemFunc &func) override;
7974

75+
void visit (HIR::TraitItemType &typ) override {}
76+
8077
private:
8178
CompileTraitItem (Context *ctx, TyTy::BaseType *concrete, Location ref_locus)
8279
: HIRCompileBase (ctx), concrete (concrete), reference (error_mark_node),

0 commit comments

Comments
 (0)