diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-02-25 21:43:04 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-25 21:43:04 +0000 |
commit | ed1a4dc33fa78808fefaf020015b2177d7cdc1ce (patch) | |
tree | 1daec8a8d99f4936805928920132a2b4be794c88 /gcc/rust/backend | |
parent | b695eb8f0bae01e00dfb9e9bf2554d1b48b76a9a (diff) | |
parent | dffb1adabd3853a8d1100e53d5fa351f8b5f180c (diff) | |
download | gcc-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.h | 4 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-block.h | 180 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.h | 24 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-extern.h | 5 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-fnparam.h | 18 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-implitem.h | 9 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-item.h | 30 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-pattern.h | 37 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-resolve-path.h | 18 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-stmt.h | 28 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-struct-field-expr.h | 61 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-var-decl.h | 49 |
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), |