aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-02-25 21:43:04 +0000
committerGitHub <noreply@github.com>2022-02-25 21:43:04 +0000
commited1a4dc33fa78808fefaf020015b2177d7cdc1ce (patch)
tree1daec8a8d99f4936805928920132a2b4be794c88 /gcc/rust/backend
parentb695eb8f0bae01e00dfb9e9bf2554d1b48b76a9a (diff)
parentdffb1adabd3853a8d1100e53d5fa351f8b5f180c (diff)
downloadgcc-ed1a4dc33fa78808fefaf020015b2177d7cdc1ce.zip
gcc-ed1a4dc33fa78808fefaf020015b2177d7cdc1ce.tar.gz
gcc-ed1a4dc33fa78808fefaf020015b2177d7cdc1ce.tar.bz2
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>
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r--gcc/rust/backend/rust-compile-base.h4
-rw-r--r--gcc/rust/backend/rust-compile-block.h180
-rw-r--r--gcc/rust/backend/rust-compile-expr.h24
-rw-r--r--gcc/rust/backend/rust-compile-extern.h5
-rw-r--r--gcc/rust/backend/rust-compile-fnparam.h18
-rw-r--r--gcc/rust/backend/rust-compile-implitem.h9
-rw-r--r--gcc/rust/backend/rust-compile-item.h30
-rw-r--r--gcc/rust/backend/rust-compile-pattern.h37
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.h18
-rw-r--r--gcc/rust/backend/rust-compile-stmt.h28
-rw-r--r--gcc/rust/backend/rust-compile-struct-field-expr.h61
-rw-r--r--gcc/rust/backend/rust-compile-var-decl.h49
12 files changed, 398 insertions, 65 deletions
diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h
index 5d27f7b..b434168 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -1,3 +1,5 @@
+// Copyright (C) 2020-2022 Free Software Foundation, Inc.
+
// This file is part of GCC.
// GCC is free software; you can redistribute it and/or modify it under
@@ -25,7 +27,7 @@
namespace Rust {
namespace Compile {
-class HIRCompileBase : public HIR::HIRFullVisitorBase
+class HIRCompileBase
{
public:
virtual ~HIRCompileBase () {}
diff --git a/gcc/rust/backend/rust-compile-block.h b/gcc/rust/backend/rust-compile-block.h
index a5a5896..4a3c6f5 100644
--- a/gcc/rust/backend/rust-compile-block.h
+++ b/gcc/rust/backend/rust-compile-block.h
@@ -25,10 +25,8 @@
namespace Rust {
namespace Compile {
-class CompileBlock : public HIRCompileBase
+class CompileBlock : public HIRCompileBase, public HIR::HIRExpressionVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree compile (HIR::BlockExpr *expr, Context *ctx, Bvariable *result)
{
@@ -39,6 +37,62 @@ public:
void visit (HIR::BlockExpr &expr) override;
+ // Empty visit for unused Expression HIR nodes.
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::ClosureExprInner &) override {}
+ void visit (HIR::ClosureExprInnerTyped &) override {}
+ void visit (HIR::StructExprFieldIdentifier &) override {}
+ void visit (HIR::StructExprFieldIdentifierValue &) override {}
+ void visit (HIR::StructExprFieldIndexValue &) override {}
+ void visit (HIR::StructExprStruct &) override {}
+ void visit (HIR::StructExprStructFields &) override {}
+ void visit (HIR::IdentifierExpr &) override {}
+ void visit (HIR::LiteralExpr &) override {}
+ void visit (HIR::BorrowExpr &) override {}
+ void visit (HIR::DereferenceExpr &) override {}
+ void visit (HIR::ErrorPropagationExpr &) override {}
+ void visit (HIR::NegationExpr &) override {}
+ void visit (HIR::ArithmeticOrLogicalExpr &) override {}
+ void visit (HIR::ComparisonExpr &) override {}
+ void visit (HIR::LazyBooleanExpr &) override {}
+ void visit (HIR::TypeCastExpr &) override {}
+ void visit (HIR::AssignmentExpr &) override {}
+ void visit (HIR::CompoundAssignmentExpr &) override {}
+ void visit (HIR::GroupedExpr &) override {}
+ void visit (HIR::ArrayExpr &) override {}
+ void visit (HIR::ArrayIndexExpr &) override {}
+ void visit (HIR::TupleExpr &) override {}
+ void visit (HIR::TupleIndexExpr &) override {}
+ void visit (HIR::CallExpr &) override {}
+ void visit (HIR::MethodCallExpr &) override {}
+ void visit (HIR::FieldAccessExpr &) override {}
+ void visit (HIR::ContinueExpr &) override {}
+ void visit (HIR::BreakExpr &) override {}
+ void visit (HIR::RangeFromToExpr &) override {}
+ void visit (HIR::RangeFromExpr &) override {}
+ void visit (HIR::RangeToExpr &) override {}
+ void visit (HIR::RangeFullExpr &) override {}
+ void visit (HIR::RangeFromToInclExpr &) override {}
+ void visit (HIR::RangeToInclExpr &) override {}
+ void visit (HIR::ReturnExpr &) override {}
+ void visit (HIR::UnsafeBlockExpr &) override {}
+ void visit (HIR::LoopExpr &) override {}
+ void visit (HIR::WhileLoopExpr &) override {}
+ void visit (HIR::WhileLetLoopExpr &) override {}
+ void visit (HIR::ForLoopExpr &) override {}
+ void visit (HIR::IfExpr &) override {}
+ void visit (HIR::IfExprConseqElse &) override {}
+ void visit (HIR::IfExprConseqIf &) override {}
+ void visit (HIR::IfExprConseqIfLet &) override {}
+ void visit (HIR::IfLetExpr &) override {}
+ void visit (HIR::IfLetExprConseqElse &) override {}
+ void visit (HIR::IfLetExprConseqIf &) override {}
+ void visit (HIR::IfLetExprConseqIfLet &) override {}
+ void visit (HIR::MatchExpr &) override {}
+ void visit (HIR::AwaitExpr &) override {}
+ void visit (HIR::AsyncBlockExpr &) override {}
+
private:
CompileBlock (Context *ctx, Bvariable *result)
: HIRCompileBase (ctx), translated (nullptr), result (result)
@@ -48,10 +102,9 @@ private:
Bvariable *result;
};
-class CompileConditionalBlocks : public HIRCompileBase
+class CompileConditionalBlocks : public HIRCompileBase,
+ public HIR::HIRExpressionVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree compile (HIR::IfExpr *expr, Context *ctx, Bvariable *result)
{
@@ -61,11 +114,63 @@ public:
}
void visit (HIR::IfExpr &expr) override;
-
void visit (HIR::IfExprConseqElse &expr) override;
-
void visit (HIR::IfExprConseqIf &expr) override;
+ // Empty visit for unused Expression HIR nodes.
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::ClosureExprInner &) override {}
+ void visit (HIR::ClosureExprInnerTyped &) override {}
+ void visit (HIR::StructExprFieldIdentifier &) override {}
+ void visit (HIR::StructExprFieldIdentifierValue &) override {}
+ void visit (HIR::StructExprFieldIndexValue &) override {}
+ void visit (HIR::StructExprStruct &) override {}
+ void visit (HIR::StructExprStructFields &) override {}
+ void visit (HIR::IdentifierExpr &) override {}
+ void visit (HIR::LiteralExpr &) override {}
+ void visit (HIR::BorrowExpr &) override {}
+ void visit (HIR::DereferenceExpr &) override {}
+ void visit (HIR::ErrorPropagationExpr &) override {}
+ void visit (HIR::NegationExpr &) override {}
+ void visit (HIR::ArithmeticOrLogicalExpr &) override {}
+ void visit (HIR::ComparisonExpr &) override {}
+ void visit (HIR::LazyBooleanExpr &) override {}
+ void visit (HIR::TypeCastExpr &) override {}
+ void visit (HIR::AssignmentExpr &) override {}
+ void visit (HIR::CompoundAssignmentExpr &) override {}
+ void visit (HIR::GroupedExpr &) override {}
+ void visit (HIR::ArrayExpr &) override {}
+ void visit (HIR::ArrayIndexExpr &) override {}
+ void visit (HIR::TupleExpr &) override {}
+ void visit (HIR::TupleIndexExpr &) override {}
+ void visit (HIR::CallExpr &) override {}
+ void visit (HIR::MethodCallExpr &) override {}
+ void visit (HIR::FieldAccessExpr &) override {}
+ void visit (HIR::BlockExpr &) override {}
+ void visit (HIR::ContinueExpr &) override {}
+ void visit (HIR::BreakExpr &) override {}
+ void visit (HIR::RangeFromToExpr &) override {}
+ void visit (HIR::RangeFromExpr &) override {}
+ void visit (HIR::RangeToExpr &) override {}
+ void visit (HIR::RangeFullExpr &) override {}
+ void visit (HIR::RangeFromToInclExpr &) override {}
+ void visit (HIR::RangeToInclExpr &) override {}
+ void visit (HIR::ReturnExpr &) override {}
+ void visit (HIR::UnsafeBlockExpr &) override {}
+ void visit (HIR::LoopExpr &) override {}
+ void visit (HIR::WhileLoopExpr &) override {}
+ void visit (HIR::WhileLetLoopExpr &) override {}
+ void visit (HIR::ForLoopExpr &) override {}
+ void visit (HIR::IfExprConseqIfLet &) override {}
+ void visit (HIR::IfLetExpr &) override {}
+ void visit (HIR::IfLetExprConseqElse &) override {}
+ void visit (HIR::IfLetExprConseqIf &) override {}
+ void visit (HIR::IfLetExprConseqIfLet &) override {}
+ void visit (HIR::MatchExpr &) override {}
+ void visit (HIR::AwaitExpr &) override {}
+ void visit (HIR::AsyncBlockExpr &) override {}
+
private:
CompileConditionalBlocks (Context *ctx, Bvariable *result)
: HIRCompileBase (ctx), translated (nullptr), result (result)
@@ -75,10 +180,9 @@ private:
Bvariable *result;
};
-class CompileExprWithBlock : public HIRCompileBase
+class CompileExprWithBlock : public HIRCompileBase,
+ public HIR::HIRExpressionVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree compile (HIR::ExprWithBlock *expr, Context *ctx,
Bvariable *result)
@@ -103,6 +207,60 @@ public:
translated = CompileConditionalBlocks::compile (&expr, ctx, result);
}
+ // Empty visit for unused Expression HIR nodes.
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::ClosureExprInner &) override {}
+ void visit (HIR::ClosureExprInnerTyped &) override {}
+ void visit (HIR::StructExprFieldIdentifier &) override {}
+ void visit (HIR::StructExprFieldIdentifierValue &) override {}
+ void visit (HIR::StructExprFieldIndexValue &) override {}
+ void visit (HIR::StructExprStruct &) override {}
+ void visit (HIR::StructExprStructFields &) override {}
+ void visit (HIR::IdentifierExpr &) override {}
+ void visit (HIR::LiteralExpr &) override {}
+ void visit (HIR::BorrowExpr &) override {}
+ void visit (HIR::DereferenceExpr &) override {}
+ void visit (HIR::ErrorPropagationExpr &) override {}
+ void visit (HIR::NegationExpr &) override {}
+ void visit (HIR::ArithmeticOrLogicalExpr &) override {}
+ void visit (HIR::ComparisonExpr &) override {}
+ void visit (HIR::LazyBooleanExpr &) override {}
+ void visit (HIR::TypeCastExpr &) override {}
+ void visit (HIR::AssignmentExpr &) override {}
+ void visit (HIR::CompoundAssignmentExpr &) override {}
+ void visit (HIR::GroupedExpr &) override {}
+ void visit (HIR::ArrayExpr &) override {}
+ void visit (HIR::ArrayIndexExpr &) override {}
+ void visit (HIR::TupleExpr &) override {}
+ void visit (HIR::TupleIndexExpr &) override {}
+ void visit (HIR::CallExpr &) override {}
+ void visit (HIR::MethodCallExpr &) override {}
+ void visit (HIR::FieldAccessExpr &) override {}
+ void visit (HIR::BlockExpr &) override {}
+ void visit (HIR::ContinueExpr &) override {}
+ void visit (HIR::BreakExpr &) override {}
+ void visit (HIR::RangeFromToExpr &) override {}
+ void visit (HIR::RangeFromExpr &) override {}
+ void visit (HIR::RangeToExpr &) override {}
+ void visit (HIR::RangeFullExpr &) override {}
+ void visit (HIR::RangeFromToInclExpr &) override {}
+ void visit (HIR::RangeToInclExpr &) override {}
+ void visit (HIR::ReturnExpr &) override {}
+ void visit (HIR::UnsafeBlockExpr &) override {}
+ void visit (HIR::LoopExpr &) override {}
+ void visit (HIR::WhileLoopExpr &) override {}
+ void visit (HIR::WhileLetLoopExpr &) override {}
+ void visit (HIR::ForLoopExpr &) override {}
+ void visit (HIR::IfExprConseqIfLet &) override {}
+ void visit (HIR::IfLetExpr &) override {}
+ void visit (HIR::IfLetExprConseqElse &) override {}
+ void visit (HIR::IfLetExprConseqIf &) override {}
+ void visit (HIR::IfLetExprConseqIfLet &) override {}
+ void visit (HIR::MatchExpr &) override {}
+ void visit (HIR::AwaitExpr &) override {}
+ void visit (HIR::AsyncBlockExpr &) override {}
+
private:
CompileExprWithBlock (Context *ctx, Bvariable *result)
: HIRCompileBase (ctx), translated (nullptr), result (result)
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index f2b4df8..3cc51d4 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -29,10 +29,8 @@
namespace Rust {
namespace Compile {
-class CompileExpr : public HIRCompileBase
+class CompileExpr : public HIRCompileBase, public HIR::HIRExpressionVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree Compile (HIR::Expr *expr, Context *ctx)
{
@@ -769,9 +767,7 @@ public:
}
void visit (HIR::BorrowExpr &expr) override;
-
void visit (HIR::DereferenceExpr &expr) override;
-
void visit (HIR::MatchExpr &expr) override;
void visit (HIR::RangeFromToExpr &expr) override;
@@ -784,6 +780,24 @@ public:
void visit (HIR::RangeFromToInclExpr &expr) override;
+ // Empty visit for unused Expression HIR nodes.
+ void visit (HIR::ClosureExprInner &) override {}
+ void visit (HIR::ClosureExprInnerTyped &) override {}
+ void visit (HIR::StructExprFieldIdentifier &) override {}
+ void visit (HIR::StructExprFieldIdentifierValue &) override {}
+ void visit (HIR::StructExprFieldIndexValue &) override {}
+ void visit (HIR::ErrorPropagationExpr &) override {}
+ void visit (HIR::RangeToInclExpr &) override {}
+ void visit (HIR::WhileLetLoopExpr &) override {}
+ void visit (HIR::ForLoopExpr &) override {}
+ void visit (HIR::IfExprConseqIfLet &) override {}
+ void visit (HIR::IfLetExpr &) override {}
+ void visit (HIR::IfLetExprConseqElse &) override {}
+ void visit (HIR::IfLetExprConseqIf &) override {}
+ void visit (HIR::IfLetExprConseqIfLet &) override {}
+ void visit (HIR::AwaitExpr &) override {}
+ void visit (HIR::AsyncBlockExpr &) override {}
+
protected:
tree compile_dyn_dispatch_call (const TyTy::DynamicObjectType *dyn,
TyTy::BaseType *receiver,
diff --git a/gcc/rust/backend/rust-compile-extern.h b/gcc/rust/backend/rust-compile-extern.h
index 1412e7a..1987805 100644
--- a/gcc/rust/backend/rust-compile-extern.h
+++ b/gcc/rust/backend/rust-compile-extern.h
@@ -25,10 +25,9 @@
namespace Rust {
namespace Compile {
-class CompileExternItem : public HIRCompileBase
+class CompileExternItem : public HIRCompileBase,
+ public HIR::HIRExternalItemVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static void compile (HIR::ExternalItem *item, Context *ctx,
TyTy::BaseType *concrete = nullptr)
diff --git a/gcc/rust/backend/rust-compile-fnparam.h b/gcc/rust/backend/rust-compile-fnparam.h
index 4ca26ec..74df725 100644
--- a/gcc/rust/backend/rust-compile-fnparam.h
+++ b/gcc/rust/backend/rust-compile-fnparam.h
@@ -24,10 +24,8 @@
namespace Rust {
namespace Compile {
-class CompileFnParam : public HIRCompileBase
+class CompileFnParam : public HIRCompileBase, public HIR::HIRPatternVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static Bvariable *compile (Context *ctx, tree fndecl,
HIR::FunctionParam *param, tree decl_type,
@@ -57,6 +55,18 @@ public:
= ctx->get_backend ()->parameter_variable (fndecl, "_", decl_type, locus);
}
+ // Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::GroupedPattern &) override {}
+ void visit (HIR::LiteralPattern &) override {}
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::RangePattern &) override {}
+ void visit (HIR::ReferencePattern &) override {}
+ void visit (HIR::SlicePattern &) override {}
+ void visit (HIR::StructPattern &) override {}
+ void visit (HIR::TuplePattern &) override {}
+ void visit (HIR::TupleStructPattern &) override {}
+
private:
CompileFnParam (Context *ctx, tree fndecl, tree decl_type, Location locus)
: HIRCompileBase (ctx), fndecl (fndecl), decl_type (decl_type),
@@ -69,7 +79,7 @@ private:
Bvariable *compiled_param;
};
-class CompileSelfParam : public HIRCompileBase
+class CompileSelfParam : public HIRCompileBase, public HIR::HIRStmtVisitor
{
public:
static Bvariable *compile (Context *ctx, tree fndecl, HIR::SelfParam &self,
diff --git a/gcc/rust/backend/rust-compile-implitem.h b/gcc/rust/backend/rust-compile-implitem.h
index 4d49c0b..ac9478a 100644
--- a/gcc/rust/backend/rust-compile-implitem.h
+++ b/gcc/rust/backend/rust-compile-implitem.h
@@ -29,8 +29,6 @@ namespace Compile {
// this is a proxy for HIR::ImplItem's back to use the normel HIR::Item path
class CompileInherentImplItem : public CompileItem
{
- using Rust::Compile::CompileItem::visit;
-
public:
static tree Compile (HIR::ImplItem *item, Context *ctx,
TyTy::BaseType *concrete = nullptr,
@@ -54,10 +52,8 @@ private:
{}
};
-class CompileTraitItem : public HIRCompileBase
+class CompileTraitItem : public HIRCompileBase, public HIR::HIRTraitItemVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree Compile (HIR::TraitItem *item, Context *ctx,
TyTy::BaseType *concrete, bool is_query_mode = false,
@@ -74,9 +70,10 @@ public:
}
void visit (HIR::TraitItemConst &constant) override;
-
void visit (HIR::TraitItemFunc &func) override;
+ void visit (HIR::TraitItemType &typ) override {}
+
private:
CompileTraitItem (Context *ctx, TyTy::BaseType *concrete, Location ref_locus)
: HIRCompileBase (ctx), concrete (concrete), reference (error_mark_node),
diff --git a/gcc/rust/backend/rust-compile-item.h b/gcc/rust/backend/rust-compile-item.h
index 897fe85..63316b9 100644
--- a/gcc/rust/backend/rust-compile-item.h
+++ b/gcc/rust/backend/rust-compile-item.h
@@ -24,11 +24,9 @@
namespace Rust {
namespace Compile {
-class CompileItem : public HIRCompileBase
+class CompileItem : public HIRCompileBase, public HIR::HIRStmtVisitor
{
protected:
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree compile (HIR::Item *item, Context *ctx,
TyTy::BaseType *concrete = nullptr,
@@ -46,17 +44,33 @@ public:
}
void visit (HIR::StaticItem &var) override;
-
void visit (HIR::ConstantItem &constant) override;
-
void visit (HIR::Function &function) override;
-
void visit (HIR::ImplBlock &impl_block) override;
-
void visit (HIR::ExternBlock &extern_block) override;
-
void visit (HIR::Module &module) override;
+ // Empty visit for unused Stmt HIR nodes.
+ void visit (HIR::TupleStruct &) override {}
+ 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 {}
+ void visit (HIR::ExternCrate &) override {}
+ void visit (HIR::UseDeclaration &) override {}
+ void visit (HIR::TypeAlias &) override {}
+ void visit (HIR::StructStruct &) override {}
+ void visit (HIR::Enum &) override {}
+ void visit (HIR::Union &) override {}
+ void visit (HIR::Trait &) override {}
+ void visit (HIR::EmptyStmt &) override {}
+ void visit (HIR::LetStmt &) override {}
+ void visit (HIR::ExprStmtWithoutBlock &) override {}
+ void visit (HIR::ExprStmtWithBlock &) override {}
+
protected:
CompileItem (Context *ctx, TyTy::BaseType *concrete, Location ref_locus)
: HIRCompileBase (ctx), concrete (concrete), reference (error_mark_node),
diff --git a/gcc/rust/backend/rust-compile-pattern.h b/gcc/rust/backend/rust-compile-pattern.h
index 535cf36..36e4ef3 100644
--- a/gcc/rust/backend/rust-compile-pattern.h
+++ b/gcc/rust/backend/rust-compile-pattern.h
@@ -21,10 +21,9 @@
namespace Rust {
namespace Compile {
-class CompilePatternCaseLabelExpr : public HIRCompileBase
+class CompilePatternCaseLabelExpr : public HIRCompileBase,
+ public HIR::HIRPatternVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree Compile (HIR::Pattern *pattern, tree associated_case_label,
Context *ctx)
@@ -35,14 +34,20 @@ public:
}
void visit (HIR::PathInExpression &pattern) override;
-
void visit (HIR::StructPattern &pattern) override;
-
void visit (HIR::TupleStructPattern &pattern) override;
-
void visit (HIR::WildcardPattern &pattern) override;
-private:
+ // Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::GroupedPattern &) override {}
+ void visit (HIR::IdentifierPattern &) override {}
+ void visit (HIR::LiteralPattern &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::RangePattern &) override {}
+ void visit (HIR::ReferencePattern &) override {}
+ void visit (HIR::SlicePattern &) override {}
+ void visit (HIR::TuplePattern &) override {}
+
CompilePatternCaseLabelExpr (Context *ctx, tree associated_case_label)
: HIRCompileBase (ctx), case_label_expr (error_mark_node),
associated_case_label (associated_case_label)
@@ -52,10 +57,9 @@ private:
tree associated_case_label;
};
-class CompilePatternBindings : public HIRCompileBase
+class CompilePatternBindings : public HIRCompileBase,
+ public HIR::HIRPatternVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static void Compile (HIR::Pattern *pattern, tree match_scrutinee_expr,
Context *ctx)
@@ -65,9 +69,20 @@ public:
}
void visit (HIR::StructPattern &pattern) override;
-
void visit (HIR::TupleStructPattern &pattern) override;
+ // Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::GroupedPattern &) override {}
+ void visit (HIR::IdentifierPattern &) override {}
+ void visit (HIR::LiteralPattern &) override {}
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::RangePattern &) override {}
+ void visit (HIR::ReferencePattern &) override {}
+ void visit (HIR::SlicePattern &) override {}
+ void visit (HIR::TuplePattern &) override {}
+ void visit (HIR::WildcardPattern &) override {}
+
private:
CompilePatternBindings (Context *ctx, tree match_scrutinee_expr)
: HIRCompileBase (ctx), match_scrutinee_expr (match_scrutinee_expr)
diff --git a/gcc/rust/backend/rust-compile-resolve-path.h b/gcc/rust/backend/rust-compile-resolve-path.h
index 9c9d7c5..37dec0b 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.h
+++ b/gcc/rust/backend/rust-compile-resolve-path.h
@@ -25,10 +25,8 @@
namespace Rust {
namespace Compile {
-class ResolvePathRef : public HIRCompileBase
+class ResolvePathRef : public HIRCompileBase, public HIR::HIRPatternVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree Compile (HIR::QualifiedPathInExpression &expr, Context *ctx)
{
@@ -45,10 +43,20 @@ public:
}
void visit (HIR::PathInExpression &expr) override;
-
void visit (HIR::QualifiedPathInExpression &expr) override;
-private:
+ // Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::GroupedPattern &) override {}
+ void visit (HIR::IdentifierPattern &) override {}
+ void visit (HIR::LiteralPattern &) override {}
+ void visit (HIR::RangePattern &) override {}
+ void visit (HIR::ReferencePattern &) override {}
+ void visit (HIR::SlicePattern &) override {}
+ void visit (HIR::StructPattern &) override {}
+ void visit (HIR::TuplePattern &) override {}
+ void visit (HIR::TupleStructPattern &) override {}
+ void visit (HIR::WildcardPattern &) override {}
+
ResolvePathRef (Context *ctx)
: HIRCompileBase (ctx), resolved (error_mark_node)
{}
diff --git a/gcc/rust/backend/rust-compile-stmt.h b/gcc/rust/backend/rust-compile-stmt.h
index 24a2084..2dfb520 100644
--- a/gcc/rust/backend/rust-compile-stmt.h
+++ b/gcc/rust/backend/rust-compile-stmt.h
@@ -26,10 +26,8 @@
namespace Rust {
namespace Compile {
-class CompileStmt : public HIRCompileBase
+class CompileStmt : public HIRCompileBase, public HIR::HIRStmtVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree Compile (HIR::Stmt *stmt, Context *ctx)
{
@@ -103,6 +101,30 @@ public:
}
}
+ // Empty visit for unused Stmt HIR nodes.
+ void visit (HIR::TupleStruct &) override {}
+ 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 {}
+ void visit (HIR::Module &) override {}
+ void visit (HIR::ExternCrate &) override {}
+ void visit (HIR::UseDeclaration &) override {}
+ void visit (HIR::Function &) override {}
+ void visit (HIR::TypeAlias &) override {}
+ void visit (HIR::StructStruct &) override {}
+ void visit (HIR::Enum &) override {}
+ void visit (HIR::Union &) override {}
+ void visit (HIR::ConstantItem &) override {}
+ void visit (HIR::StaticItem &) override {}
+ void visit (HIR::Trait &) override {}
+ void visit (HIR::ImplBlock &) override {}
+ void visit (HIR::ExternBlock &) override {}
+ void visit (HIR::EmptyStmt &) override {}
+
private:
CompileStmt (Context *ctx) : HIRCompileBase (ctx), translated (nullptr) {}
diff --git a/gcc/rust/backend/rust-compile-struct-field-expr.h b/gcc/rust/backend/rust-compile-struct-field-expr.h
index 0570973..c5e986e 100644
--- a/gcc/rust/backend/rust-compile-struct-field-expr.h
+++ b/gcc/rust/backend/rust-compile-struct-field-expr.h
@@ -25,10 +25,9 @@
namespace Rust {
namespace Compile {
-class CompileStructExprField : public HIRCompileBase
+class CompileStructExprField : public HIRCompileBase,
+ public HIR::HIRExpressionVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
-
public:
static tree Compile (HIR::StructExprField *field, Context *ctx)
{
@@ -39,11 +38,63 @@ public:
}
void visit (HIR::StructExprFieldIdentifierValue &field) override;
-
void visit (HIR::StructExprFieldIndexValue &field) override;
-
void visit (HIR::StructExprFieldIdentifier &field) override;
+ // Empty visit for unused Expression HIR nodes.
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::ClosureExprInner &) override {}
+ void visit (HIR::ClosureExprInnerTyped &) override {}
+ void visit (HIR::StructExprStruct &) override {}
+ void visit (HIR::StructExprStructFields &) override {}
+ void visit (HIR::IdentifierExpr &) override {}
+ void visit (HIR::LiteralExpr &) override {}
+ void visit (HIR::BorrowExpr &) override {}
+ void visit (HIR::DereferenceExpr &) override {}
+ void visit (HIR::ErrorPropagationExpr &) override {}
+ void visit (HIR::NegationExpr &) override {}
+ void visit (HIR::ArithmeticOrLogicalExpr &) override {}
+ void visit (HIR::ComparisonExpr &) override {}
+ void visit (HIR::LazyBooleanExpr &) override {}
+ void visit (HIR::TypeCastExpr &) override {}
+ void visit (HIR::AssignmentExpr &) override {}
+ void visit (HIR::CompoundAssignmentExpr &) override {}
+ void visit (HIR::GroupedExpr &) override {}
+ void visit (HIR::ArrayExpr &) override {}
+ void visit (HIR::ArrayIndexExpr &) override {}
+ void visit (HIR::TupleExpr &) override {}
+ void visit (HIR::TupleIndexExpr &) override {}
+ void visit (HIR::CallExpr &) override {}
+ void visit (HIR::MethodCallExpr &) override {}
+ void visit (HIR::FieldAccessExpr &) override {}
+ void visit (HIR::BlockExpr &) override {}
+ void visit (HIR::ContinueExpr &) override {}
+ void visit (HIR::BreakExpr &) override {}
+ void visit (HIR::RangeFromToExpr &) override {}
+ void visit (HIR::RangeFromExpr &) override {}
+ void visit (HIR::RangeToExpr &) override {}
+ void visit (HIR::RangeFullExpr &) override {}
+ void visit (HIR::RangeFromToInclExpr &) override {}
+ void visit (HIR::RangeToInclExpr &) override {}
+ void visit (HIR::ReturnExpr &) override {}
+ void visit (HIR::UnsafeBlockExpr &) override {}
+ void visit (HIR::LoopExpr &) override {}
+ void visit (HIR::WhileLoopExpr &) override {}
+ void visit (HIR::WhileLetLoopExpr &) override {}
+ void visit (HIR::ForLoopExpr &) override {}
+ void visit (HIR::IfExpr &) override {}
+ void visit (HIR::IfExprConseqElse &) override {}
+ void visit (HIR::IfExprConseqIf &) override {}
+ void visit (HIR::IfExprConseqIfLet &) override {}
+ void visit (HIR::IfLetExpr &) override {}
+ void visit (HIR::IfLetExprConseqElse &) override {}
+ void visit (HIR::IfLetExprConseqIf &) override {}
+ void visit (HIR::IfLetExprConseqIfLet &) override {}
+ void visit (HIR::MatchExpr &) override {}
+ void visit (HIR::AwaitExpr &) override {}
+ void visit (HIR::AsyncBlockExpr &) override {}
+
private:
CompileStructExprField (Context *ctx)
: HIRCompileBase (ctx), translated (nullptr)
diff --git a/gcc/rust/backend/rust-compile-var-decl.h b/gcc/rust/backend/rust-compile-var-decl.h
index c431edd..2dab39e 100644
--- a/gcc/rust/backend/rust-compile-var-decl.h
+++ b/gcc/rust/backend/rust-compile-var-decl.h
@@ -20,13 +20,17 @@
#define RUST_COMPILE_VAR_DECL
#include "rust-compile-base.h"
+#include "rust-hir-visitor.h"
namespace Rust {
namespace Compile {
-class CompileVarDecl : public HIRCompileBase
+class CompileVarDecl : public HIRCompileBase,
+ public HIR::HIRPatternVisitor,
+ public HIR::HIRStmtVisitor
{
- using Rust::Compile::HIRCompileBase::visit;
+ using HIR::HIRPatternVisitor::visit;
+ using HIR::HIRStmtVisitor::visit;
public:
static ::Bvariable *compile (tree fndecl, HIR::Stmt *stmt, Context *ctx)
@@ -47,7 +51,8 @@ public:
rust_assert (ok);
translated_type = TyTyResolveCompile::compile (ctx, resolved_type);
- stmt.get_pattern ()->accept_vis (*this);
+ stmt.get_pattern ()->accept_vis (
+ static_cast<HIR::HIRPatternVisitor &> (*this));
}
void visit (HIR::IdentifierPattern &pattern) override
@@ -70,6 +75,44 @@ public:
NULL /*decl_var*/, locus);
}
+ // Empty visit for unused Pattern HIR nodes.
+ void visit (HIR::GroupedPattern &) override {}
+ void visit (HIR::LiteralPattern &) override {}
+ void visit (HIR::PathInExpression &) override {}
+ void visit (HIR::QualifiedPathInExpression &) override {}
+ void visit (HIR::RangePattern &) override {}
+ void visit (HIR::ReferencePattern &) override {}
+ void visit (HIR::SlicePattern &) override {}
+ void visit (HIR::StructPattern &) override {}
+ void visit (HIR::TuplePattern &) override {}
+ void visit (HIR::TupleStructPattern &) override {}
+
+ // Empty visit for unused Stmt HIR nodes.
+ void visit (HIR::EnumItemTuple &) override {}
+ void visit (HIR::EnumItemStruct &) override {}
+ void visit (HIR::EnumItem &item) override {}
+ void visit (HIR::TupleStruct &tuple_struct) override {}
+ void visit (HIR::EnumItemDiscriminant &) override {}
+ void visit (HIR::TypePathSegmentFunction &segment) override {}
+ void visit (HIR::TypePath &path) override {}
+ void visit (HIR::QualifiedPathInType &path) override {}
+ void visit (HIR::Module &module) override {}
+ void visit (HIR::ExternCrate &crate) override {}
+ void visit (HIR::UseDeclaration &use_decl) override {}
+ void visit (HIR::Function &function) override {}
+ void visit (HIR::TypeAlias &type_alias) override {}
+ void visit (HIR::StructStruct &struct_item) override {}
+ void visit (HIR::Enum &enum_item) override {}
+ void visit (HIR::Union &union_item) override {}
+ void visit (HIR::ConstantItem &const_item) override {}
+ void visit (HIR::StaticItem &static_item) override {}
+ void visit (HIR::Trait &trait) override {}
+ void visit (HIR::ImplBlock &impl) override {}
+ void visit (HIR::ExternBlock &block) override {}
+ void visit (HIR::EmptyStmt &stmt) override {}
+ void visit (HIR::ExprStmtWithoutBlock &stmt) override {}
+ void visit (HIR::ExprStmtWithBlock &stmt) override {}
+
private:
CompileVarDecl (Context *ctx, tree fndecl)
: HIRCompileBase (ctx), fndecl (fndecl), translated_type (error_mark_node),