aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/hir
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/hir')
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.cc39
-rw-r--r--gcc/rust/hir/rust-ast-lower-base.h357
-rw-r--r--gcc/rust/hir/rust-ast-lower-block.h4
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.cc82
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.h2
-rw-r--r--gcc/rust/hir/rust-ast-lower-implitem.cc29
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.cc16
-rw-r--r--gcc/rust/hir/rust-ast-lower-stmt.cc14
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.cc38
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.h3
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc46
-rw-r--r--gcc/rust/hir/rust-hir-dump.cc55
-rw-r--r--gcc/rust/hir/rust-hir-dump.h2
-rw-r--r--gcc/rust/hir/tree/rust-hir-bound.h12
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr-abstract.h1
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.cc24
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h125
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-decls.h2
-rw-r--r--gcc/rust/hir/tree/rust-hir-generic-param.h3
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.cc28
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h63
-rw-r--r--gcc/rust/hir/tree/rust-hir-path.cc20
-rw-r--r--gcc/rust/hir/tree/rust-hir-path.h95
-rw-r--r--gcc/rust/hir/tree/rust-hir-stmt.cc12
-rw-r--r--gcc/rust/hir/tree/rust-hir-stmt.h16
-rw-r--r--gcc/rust/hir/tree/rust-hir-type.cc5
-rw-r--r--gcc/rust/hir/tree/rust-hir-type.h41
-rw-r--r--gcc/rust/hir/tree/rust-hir-visitor.h6
-rw-r--r--gcc/rust/hir/tree/rust-hir.cc143
29 files changed, 790 insertions, 493 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index 35a2509..2d9a445 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -23,6 +23,7 @@
#include "rust-ast.h"
#include "rust-attribute-values.h"
#include "rust-diagnostics.h"
+#include "rust-expr.h"
#include "rust-item.h"
#include "rust-system.h"
#include "rust-attributes.h"
@@ -31,6 +32,21 @@ namespace Rust {
namespace HIR {
void
+ASTLoweringBase::visit (AST::MacroInvocation &invoc)
+{
+ rust_fatal_error (invoc.get_locus (), "rogue macro detected during lowering");
+ rust_unreachable ();
+}
+
+void
+ASTLoweringBase::visit (AST::ErrorPropagationExpr &expr)
+{
+ rust_fatal_error (expr.get_locus (),
+ "missing desugar for question mark operator");
+ rust_unreachable ();
+}
+
+void
ASTLoweringBase::visit (AST::Token &)
{}
void
@@ -108,9 +124,6 @@ void
ASTLoweringBase::visit (AST::DereferenceExpr &)
{}
void
-ASTLoweringBase::visit (AST::ErrorPropagationExpr &)
-{}
-void
ASTLoweringBase::visit (AST::NegationExpr &)
{}
void
@@ -254,6 +267,10 @@ void
ASTLoweringBase::visit (AST::InlineAsm &)
{}
+void
+ASTLoweringBase::visit (AST::LlvmInlineAsm &)
+{}
+
// void ASTLoweringBase::visit(MatchCasematch_case) {}
// void ASTLoweringBase:: (AST::MatchCaseBlockExpr &) {}
// void ASTLoweringBase:: (AST::MatchCaseExpr &) {}
@@ -373,9 +390,6 @@ void
ASTLoweringBase::visit (AST::MacroRulesDefinition &)
{}
void
-ASTLoweringBase::visit (AST::MacroInvocation &)
-{}
-void
ASTLoweringBase::visit (AST::MetaItemPath &)
{}
void
@@ -666,6 +680,7 @@ ASTLoweringBase::lower_self (AST::Param &param)
Analysis::NodeMapping mapping (crate_num, self.get_node_id (),
mappings.get_next_hir_id (crate_num),
mappings.get_next_localdef_id (crate_num));
+ mappings.insert_location (mapping.get_hirid (), param.get_locus ());
if (self.has_type ())
{
@@ -679,8 +694,12 @@ ASTLoweringBase::lower_self (AST::Param &param)
self.get_is_mut (), self.get_locus ());
}
- AST::Lifetime l = self.get_lifetime ();
- return HIR::SelfParam (mapping, lower_lifetime (l), self.get_is_mut (),
+ tl::optional<HIR::Lifetime> lifetime = tl::nullopt;
+
+ if (self.has_lifetime ())
+ lifetime = lower_lifetime (self.get_lifetime ());
+
+ return HIR::SelfParam (mapping, lifetime, self.get_is_mut (),
self.get_locus ());
}
@@ -922,8 +941,8 @@ ASTLoweringBase::lower_literal (const AST::Literal &literal)
case AST::Literal::LitType::BYTE_STRING:
type = HIR::Literal::LitType::BYTE_STRING;
break;
- case AST::Literal::LitType::RAW_STRING: // TODO: Lower raw string literals.
- rust_unreachable ();
+ case AST::Literal::LitType::RAW_STRING:
+ type = HIR::Literal::LitType::STRING;
break;
case AST::Literal::LitType::INT:
type = HIR::Literal::LitType::INT;
diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h
index 1bd1343..3116181 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -60,202 +60,205 @@ class ASTLoweringBase : public AST::ASTVisitor
public:
virtual ~ASTLoweringBase () {}
+ // Special casing nodes that should never reach the HIR lowering stage
+ virtual void visit (AST::MacroInvocation &) override final;
+ virtual void visit (AST::ErrorPropagationExpr &) override final;
+
// visitor impl
// rust-ast.h
// virtual void visit(AttrInput& attr_input);
// virtual void visit(TokenTree& token_tree);
// virtual void visit(MacroMatch& macro_match);
- virtual void visit (AST::Token &tok);
- virtual void visit (AST::DelimTokenTree &delim_tok_tree);
- virtual void visit (AST::AttrInputMetaItemContainer &input);
- // virtual void visit(MetaItem& meta_item);
- // void vsit(Stmt& stmt);
- // virtual void visit(Expr& expr);
- virtual void visit (AST::IdentifierExpr &ident_expr);
- // virtual void visit(Pattern& pattern);
- // virtual void visit(Type& type);
- // virtual void visit(TypeParamBound& type_param_bound);
- virtual void visit (AST::Lifetime &lifetime);
- // virtual void visit(GenericParam& generic_param);
- virtual void visit (AST::LifetimeParam &lifetime_param);
- virtual void visit (AST::ConstGenericParam &const_param);
- // virtual void visit(TraitItem& trait_item);
- // virtual void visit(InherentImplItem& inherent_impl_item);
- // virtual void visit(TraitImplItem& trait_impl_item);
+ virtual void visit (AST::Token &tok) override;
+ virtual void visit (AST::DelimTokenTree &delim_tok_tree) override;
+ virtual void visit (AST::AttrInputMetaItemContainer &input) override;
+ // virtual void visit(MetaItem& meta_item) override;
+ // void vsit(Stmt& stmt) override;
+ // virtual void visit(Expr& expr) override;
+ virtual void visit (AST::IdentifierExpr &ident_expr) override;
+ // virtual void visit(Pattern& pattern) override;
+ // virtual void visit(Type& type) override;
+ // virtual void visit(TypeParamBound& type_param_bound) override;
+ virtual void visit (AST::Lifetime &lifetime) override;
+ // virtual void visit(GenericParam& generic_param) override;
+ virtual void visit (AST::LifetimeParam &lifetime_param) override;
+ virtual void visit (AST::ConstGenericParam &const_param) override;
+ // virtual void visit(TraitItem& trait_item) override;
+ // virtual void visit(InherentImplItem& inherent_impl_item) override;
+ // virtual void visit(TraitImplItem& trait_impl_item) override;
// rust-path.h
- virtual void visit (AST::PathInExpression &path);
- virtual void visit (AST::TypePathSegment &segment);
- virtual void visit (AST::TypePathSegmentGeneric &segment);
- virtual void visit (AST::TypePathSegmentFunction &segment);
- virtual void visit (AST::TypePath &path);
- virtual void visit (AST::QualifiedPathInExpression &path);
- virtual void visit (AST::QualifiedPathInType &path);
+ virtual void visit (AST::PathInExpression &path) override;
+ virtual void visit (AST::TypePathSegment &segment) override;
+ virtual void visit (AST::TypePathSegmentGeneric &segment) override;
+ virtual void visit (AST::TypePathSegmentFunction &segment) override;
+ virtual void visit (AST::TypePath &path) override;
+ virtual void visit (AST::QualifiedPathInExpression &path) override;
+ virtual void visit (AST::QualifiedPathInType &path) override;
// rust-expr.h
- virtual void visit (AST::LiteralExpr &expr);
- virtual void visit (AST::AttrInputLiteral &attr_input);
- virtual void visit (AST::AttrInputMacro &attr_input);
- virtual void visit (AST::MetaItemLitExpr &meta_item);
- virtual void visit (AST::MetaItemPathLit &meta_item);
- virtual void visit (AST::BorrowExpr &expr);
- virtual void visit (AST::DereferenceExpr &expr);
- virtual void visit (AST::ErrorPropagationExpr &expr);
- virtual void visit (AST::NegationExpr &expr);
- virtual void visit (AST::ArithmeticOrLogicalExpr &expr);
- virtual void visit (AST::ComparisonExpr &expr);
- virtual void visit (AST::LazyBooleanExpr &expr);
- virtual void visit (AST::TypeCastExpr &expr);
- virtual void visit (AST::AssignmentExpr &expr);
- virtual void visit (AST::CompoundAssignmentExpr &expr);
- virtual void visit (AST::GroupedExpr &expr);
- // virtual void visit(ArrayElems& elems);
- virtual void visit (AST::ArrayElemsValues &elems);
- virtual void visit (AST::ArrayElemsCopied &elems);
- virtual void visit (AST::ArrayExpr &expr);
- virtual void visit (AST::ArrayIndexExpr &expr);
- virtual void visit (AST::TupleExpr &expr);
- virtual void visit (AST::TupleIndexExpr &expr);
- virtual void visit (AST::StructExprStruct &expr);
- // virtual void visit(StructExprField& field);
- virtual void visit (AST::StructExprFieldIdentifier &field);
- virtual void visit (AST::StructExprFieldIdentifierValue &field);
- virtual void visit (AST::StructExprFieldIndexValue &field);
- virtual void visit (AST::StructExprStructFields &expr);
- virtual void visit (AST::StructExprStructBase &expr);
- virtual void visit (AST::CallExpr &expr);
- virtual void visit (AST::MethodCallExpr &expr);
- virtual void visit (AST::FieldAccessExpr &expr);
- virtual void visit (AST::ClosureExprInner &expr);
- virtual void visit (AST::BlockExpr &expr);
- virtual void visit (AST::ClosureExprInnerTyped &expr);
- virtual void visit (AST::ContinueExpr &expr);
- virtual void visit (AST::BreakExpr &expr);
- virtual void visit (AST::RangeFromToExpr &expr);
- virtual void visit (AST::RangeFromExpr &expr);
- virtual void visit (AST::RangeToExpr &expr);
- virtual void visit (AST::RangeFullExpr &expr);
- virtual void visit (AST::RangeFromToInclExpr &expr);
- virtual void visit (AST::RangeToInclExpr &expr);
- virtual void visit (AST::BoxExpr &expr);
- virtual void visit (AST::ReturnExpr &expr);
- virtual void visit (AST::UnsafeBlockExpr &expr);
- virtual void visit (AST::LoopExpr &expr);
- virtual void visit (AST::WhileLoopExpr &expr);
- virtual void visit (AST::WhileLetLoopExpr &expr);
- virtual void visit (AST::ForLoopExpr &expr);
- virtual void visit (AST::IfExpr &expr);
- virtual void visit (AST::IfExprConseqElse &expr);
- virtual void visit (AST::IfLetExpr &expr);
- virtual void visit (AST::IfLetExprConseqElse &expr);
- virtual void visit (AST::InlineAsm &expr);
- // virtual void visit(MatchCase& match_case);
- // virtual void visit (AST::MatchCaseBlockExpr &match_case);
- // virtual void visit (AST::MatchCaseExpr &match_case);
- virtual void visit (AST::MatchExpr &expr);
- virtual void visit (AST::AwaitExpr &expr);
- virtual void visit (AST::AsyncBlockExpr &expr);
+ virtual void visit (AST::LiteralExpr &expr) override;
+ virtual void visit (AST::AttrInputLiteral &attr_input) override;
+ virtual void visit (AST::AttrInputMacro &attr_input) override;
+ virtual void visit (AST::MetaItemLitExpr &meta_item) override;
+ virtual void visit (AST::MetaItemPathLit &meta_item) override;
+ virtual void visit (AST::BorrowExpr &expr) override;
+ virtual void visit (AST::DereferenceExpr &expr) override;
+ virtual void visit (AST::NegationExpr &expr) override;
+ virtual void visit (AST::ArithmeticOrLogicalExpr &expr) override;
+ virtual void visit (AST::ComparisonExpr &expr) override;
+ virtual void visit (AST::LazyBooleanExpr &expr) override;
+ virtual void visit (AST::TypeCastExpr &expr) override;
+ virtual void visit (AST::AssignmentExpr &expr) override;
+ virtual void visit (AST::CompoundAssignmentExpr &expr) override;
+ virtual void visit (AST::GroupedExpr &expr) override;
+ // virtual void visit(ArrayElems& elems) override;
+ virtual void visit (AST::ArrayElemsValues &elems) override;
+ virtual void visit (AST::ArrayElemsCopied &elems) override;
+ virtual void visit (AST::ArrayExpr &expr) override;
+ virtual void visit (AST::ArrayIndexExpr &expr) override;
+ virtual void visit (AST::TupleExpr &expr) override;
+ virtual void visit (AST::TupleIndexExpr &expr) override;
+ virtual void visit (AST::StructExprStruct &expr) override;
+ // virtual void visit(StructExprField& field) override;
+ virtual void visit (AST::StructExprFieldIdentifier &field) override;
+ virtual void visit (AST::StructExprFieldIdentifierValue &field) override;
+ virtual void visit (AST::StructExprFieldIndexValue &field) override;
+ virtual void visit (AST::StructExprStructFields &expr) override;
+ virtual void visit (AST::StructExprStructBase &expr) override;
+ virtual void visit (AST::CallExpr &expr) override;
+ virtual void visit (AST::MethodCallExpr &expr) override;
+ virtual void visit (AST::FieldAccessExpr &expr) override;
+ virtual void visit (AST::ClosureExprInner &expr) override;
+ virtual void visit (AST::BlockExpr &expr) override;
+ virtual void visit (AST::ClosureExprInnerTyped &expr) override;
+ virtual void visit (AST::ContinueExpr &expr) override;
+ virtual void visit (AST::BreakExpr &expr) override;
+ virtual void visit (AST::RangeFromToExpr &expr) override;
+ virtual void visit (AST::RangeFromExpr &expr) override;
+ virtual void visit (AST::RangeToExpr &expr) override;
+ virtual void visit (AST::RangeFullExpr &expr) override;
+ virtual void visit (AST::RangeFromToInclExpr &expr) override;
+ virtual void visit (AST::RangeToInclExpr &expr) override;
+ virtual void visit (AST::BoxExpr &expr) override;
+ virtual void visit (AST::ReturnExpr &expr) override;
+ virtual void visit (AST::UnsafeBlockExpr &expr) override;
+ virtual void visit (AST::LoopExpr &expr) override;
+ virtual void visit (AST::WhileLoopExpr &expr) override;
+ virtual void visit (AST::WhileLetLoopExpr &expr) override;
+ virtual void visit (AST::ForLoopExpr &expr) override;
+ virtual void visit (AST::IfExpr &expr) override;
+ virtual void visit (AST::IfExprConseqElse &expr) override;
+ virtual void visit (AST::IfLetExpr &expr) override;
+ virtual void visit (AST::IfLetExprConseqElse &expr) override;
+ virtual void visit (AST::InlineAsm &expr) override;
+ virtual void visit (AST::LlvmInlineAsm &expr) override;
+ // virtual void visit(MatchCase& match_case) override;
+ // virtual void visit (AST::MatchCaseBlockExpr &match_case) override;
+ // virtual void visit (AST::MatchCaseExpr &match_case) override;
+ virtual void visit (AST::MatchExpr &expr) override;
+ virtual void visit (AST::AwaitExpr &expr) override;
+ virtual void visit (AST::AsyncBlockExpr &expr) override;
// rust-item.h
- virtual void visit (AST::TypeParam &param);
- // virtual void visit(WhereClauseItem& item);
- virtual void visit (AST::LifetimeWhereClauseItem &item);
- virtual void visit (AST::TypeBoundWhereClauseItem &item);
- virtual void visit (AST::Module &module);
- virtual void visit (AST::ExternCrate &crate);
- // virtual void visit(UseTree& use_tree);
- virtual void visit (AST::UseTreeGlob &use_tree);
- virtual void visit (AST::UseTreeList &use_tree);
- virtual void visit (AST::UseTreeRebind &use_tree);
- virtual void visit (AST::UseDeclaration &use_decl);
- virtual void visit (AST::Function &function);
- virtual void visit (AST::TypeAlias &type_alias);
- virtual void visit (AST::StructStruct &struct_item);
- virtual void visit (AST::TupleStruct &tuple_struct);
- virtual void visit (AST::EnumItem &item);
- virtual void visit (AST::EnumItemTuple &item);
- virtual void visit (AST::EnumItemStruct &item);
- virtual void visit (AST::EnumItemDiscriminant &item);
- virtual void visit (AST::Enum &enum_item);
- virtual void visit (AST::Union &union_item);
- virtual void visit (AST::ConstantItem &const_item);
- virtual void visit (AST::StaticItem &static_item);
- virtual void visit (AST::TraitItemConst &item);
- virtual void visit (AST::TraitItemType &item);
- virtual void visit (AST::Trait &trait);
- virtual void visit (AST::InherentImpl &impl);
- virtual void visit (AST::TraitImpl &impl);
- // virtual void visit(ExternalItem& item);
- virtual void visit (AST::ExternalTypeItem &item);
- virtual void visit (AST::ExternalStaticItem &item);
- virtual void visit (AST::ExternBlock &block);
+ virtual void visit (AST::TypeParam &param) override;
+ // virtual void visit(WhereClauseItem& item) override;
+ virtual void visit (AST::LifetimeWhereClauseItem &item) override;
+ virtual void visit (AST::TypeBoundWhereClauseItem &item) override;
+ virtual void visit (AST::Module &module) override;
+ virtual void visit (AST::ExternCrate &crate) override;
+ // virtual void visit(UseTree& use_tree) override;
+ virtual void visit (AST::UseTreeGlob &use_tree) override;
+ virtual void visit (AST::UseTreeList &use_tree) override;
+ virtual void visit (AST::UseTreeRebind &use_tree) override;
+ virtual void visit (AST::UseDeclaration &use_decl) override;
+ virtual void visit (AST::Function &function) override;
+ virtual void visit (AST::TypeAlias &type_alias) override;
+ virtual void visit (AST::StructStruct &struct_item) override;
+ virtual void visit (AST::TupleStruct &tuple_struct) override;
+ virtual void visit (AST::EnumItem &item) override;
+ virtual void visit (AST::EnumItemTuple &item) override;
+ virtual void visit (AST::EnumItemStruct &item) override;
+ virtual void visit (AST::EnumItemDiscriminant &item) override;
+ virtual void visit (AST::Enum &enum_item) override;
+ virtual void visit (AST::Union &union_item) override;
+ virtual void visit (AST::ConstantItem &const_item) override;
+ virtual void visit (AST::StaticItem &static_item) override;
+ virtual void visit (AST::TraitItemConst &item) override;
+ virtual void visit (AST::TraitItemType &item) override;
+ virtual void visit (AST::Trait &trait) override;
+ virtual void visit (AST::InherentImpl &impl) override;
+ virtual void visit (AST::TraitImpl &impl) override;
+ // virtual void visit(ExternalItem& item) override;
+ virtual void visit (AST::ExternalTypeItem &item) override;
+ virtual void visit (AST::ExternalStaticItem &item) override;
+ virtual void visit (AST::ExternBlock &block) override;
// rust-macro.h
- virtual void visit (AST::MacroMatchFragment &match);
- virtual void visit (AST::MacroMatchRepetition &match);
- virtual void visit (AST::MacroMatcher &matcher);
- virtual void visit (AST::MacroRulesDefinition &rules_def);
- virtual void visit (AST::MacroInvocation &macro_invoc);
- virtual void visit (AST::MetaItemPath &meta_item);
- virtual void visit (AST::MetaItemSeq &meta_item);
- virtual void visit (AST::MetaWord &meta_item);
- virtual void visit (AST::MetaNameValueStr &meta_item);
- virtual void visit (AST::MetaListPaths &meta_item);
- virtual void visit (AST::MetaListNameValueStr &meta_item);
+ virtual void visit (AST::MacroMatchFragment &match) override;
+ virtual void visit (AST::MacroMatchRepetition &match) override;
+ virtual void visit (AST::MacroMatcher &matcher) override;
+ virtual void visit (AST::MacroRulesDefinition &rules_def) override;
+ virtual void visit (AST::MetaItemPath &meta_item) override;
+ virtual void visit (AST::MetaItemSeq &meta_item) override;
+ virtual void visit (AST::MetaWord &meta_item) override;
+ virtual void visit (AST::MetaNameValueStr &meta_item) override;
+ virtual void visit (AST::MetaListPaths &meta_item) override;
+ virtual void visit (AST::MetaListNameValueStr &meta_item) override;
// rust-pattern.h
- virtual void visit (AST::LiteralPattern &pattern);
- virtual void visit (AST::IdentifierPattern &pattern);
- virtual void visit (AST::WildcardPattern &pattern);
- virtual void visit (AST::RestPattern &pattern);
- // virtual void visit(RangePatternBound& bound);
- virtual void visit (AST::RangePatternBoundLiteral &bound);
- virtual void visit (AST::RangePatternBoundPath &bound);
- virtual void visit (AST::RangePatternBoundQualPath &bound);
- virtual void visit (AST::RangePattern &pattern);
- virtual void visit (AST::ReferencePattern &pattern);
- // virtual void visit(StructPatternField& field);
- virtual void visit (AST::StructPatternFieldTuplePat &field);
- virtual void visit (AST::StructPatternFieldIdentPat &field);
- virtual void visit (AST::StructPatternFieldIdent &field);
- virtual void visit (AST::StructPattern &pattern);
- // virtual void visit(TupleStructItems& tuple_items);
- virtual void visit (AST::TupleStructItemsNoRange &tuple_items);
- virtual void visit (AST::TupleStructItemsRange &tuple_items);
- virtual void visit (AST::TupleStructPattern &pattern);
- // virtual void visit(TuplePatternItems& tuple_items);
- virtual void visit (AST::TuplePatternItemsMultiple &tuple_items);
- virtual void visit (AST::TuplePatternItemsRanged &tuple_items);
- virtual void visit (AST::TuplePattern &pattern);
- virtual void visit (AST::GroupedPattern &pattern);
- virtual void visit (AST::SlicePattern &pattern);
- virtual void visit (AST::AltPattern &pattern);
+ virtual void visit (AST::LiteralPattern &pattern) override;
+ virtual void visit (AST::IdentifierPattern &pattern) override;
+ virtual void visit (AST::WildcardPattern &pattern) override;
+ virtual void visit (AST::RestPattern &pattern) override;
+ // virtual void visit(RangePatternBound& bound) override;
+ virtual void visit (AST::RangePatternBoundLiteral &bound) override;
+ virtual void visit (AST::RangePatternBoundPath &bound) override;
+ virtual void visit (AST::RangePatternBoundQualPath &bound) override;
+ virtual void visit (AST::RangePattern &pattern) override;
+ virtual void visit (AST::ReferencePattern &pattern) override;
+ // virtual void visit(StructPatternField& field) override;
+ virtual void visit (AST::StructPatternFieldTuplePat &field) override;
+ virtual void visit (AST::StructPatternFieldIdentPat &field) override;
+ virtual void visit (AST::StructPatternFieldIdent &field) override;
+ virtual void visit (AST::StructPattern &pattern) override;
+ // virtual void visit(TupleStructItems& tuple_items) override;
+ virtual void visit (AST::TupleStructItemsNoRange &tuple_items) override;
+ virtual void visit (AST::TupleStructItemsRange &tuple_items) override;
+ virtual void visit (AST::TupleStructPattern &pattern) override;
+ // virtual void visit(TuplePatternItems& tuple_items) override;
+ virtual void visit (AST::TuplePatternItemsMultiple &tuple_items) override;
+ virtual void visit (AST::TuplePatternItemsRanged &tuple_items) override;
+ virtual void visit (AST::TuplePattern &pattern) override;
+ virtual void visit (AST::GroupedPattern &pattern) override;
+ virtual void visit (AST::SlicePattern &pattern) override;
+ virtual void visit (AST::AltPattern &pattern) override;
// rust-stmt.h
- virtual void visit (AST::EmptyStmt &stmt);
- virtual void visit (AST::LetStmt &stmt);
- virtual void visit (AST::ExprStmt &stmt);
+ virtual void visit (AST::EmptyStmt &stmt) override;
+ virtual void visit (AST::LetStmt &stmt) override;
+ virtual void visit (AST::ExprStmt &stmt) override;
// rust-type.h
- virtual void visit (AST::TraitBound &bound);
- virtual void visit (AST::ImplTraitType &type);
- virtual void visit (AST::TraitObjectType &type);
- virtual void visit (AST::ParenthesisedType &type);
- virtual void visit (AST::ImplTraitTypeOneBound &type);
- virtual void visit (AST::TraitObjectTypeOneBound &type);
- virtual void visit (AST::TupleType &type);
- virtual void visit (AST::NeverType &type);
- virtual void visit (AST::RawPointerType &type);
- virtual void visit (AST::ReferenceType &type);
- virtual void visit (AST::ArrayType &type);
- virtual void visit (AST::SliceType &type);
- virtual void visit (AST::InferredType &type);
- virtual void visit (AST::BareFunctionType &type);
- virtual void visit (AST::FunctionParam &param);
- virtual void visit (AST::VariadicParam &param);
- virtual void visit (AST::SelfParam &param);
-
- virtual void visit (AST::FormatArgs &fmt);
+ virtual void visit (AST::TraitBound &bound) override;
+ virtual void visit (AST::ImplTraitType &type) override;
+ virtual void visit (AST::TraitObjectType &type) override;
+ virtual void visit (AST::ParenthesisedType &type) override;
+ virtual void visit (AST::ImplTraitTypeOneBound &type) override;
+ virtual void visit (AST::TraitObjectTypeOneBound &type) override;
+ virtual void visit (AST::TupleType &type) override;
+ virtual void visit (AST::NeverType &type) override;
+ virtual void visit (AST::RawPointerType &type) override;
+ virtual void visit (AST::ReferenceType &type) override;
+ virtual void visit (AST::ArrayType &type) override;
+ virtual void visit (AST::SliceType &type) override;
+ virtual void visit (AST::InferredType &type) override;
+ virtual void visit (AST::BareFunctionType &type) override;
+ virtual void visit (AST::FunctionParam &param) override;
+ virtual void visit (AST::VariadicParam &param) override;
+ virtual void visit (AST::SelfParam &param) override;
+
+ virtual void visit (AST::FormatArgs &fmt) override;
protected:
ASTLoweringBase ()
diff --git a/gcc/rust/hir/rust-ast-lower-block.h b/gcc/rust/hir/rust-ast-lower-block.h
index a39c010..93cd443 100644
--- a/gcc/rust/hir/rust-ast-lower-block.h
+++ b/gcc/rust/hir/rust-ast-lower-block.h
@@ -195,7 +195,9 @@ public:
HIR::BlockExpr *loop_block
= ASTLoweringBlock::translate (expr.get_loop_block (), &terminated);
- HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
+ tl::optional<HIR::LoopLabel> loop_label = tl::nullopt;
+ if (expr.has_loop_label ())
+ loop_label = lower_loop_label (expr.get_loop_label ());
auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
diff --git a/gcc/rust/hir/rust-ast-lower-expr.cc b/gcc/rust/hir/rust-ast-lower-expr.cc
index 7ccb251..07d0c835 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.cc
+++ b/gcc/rust/hir/rust-ast-lower-expr.cc
@@ -591,14 +591,16 @@ ASTLoweringExpr::visit (AST::WhileLoopExpr &expr)
void
ASTLoweringExpr::visit (AST::ForLoopExpr &expr)
{
- translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
+ rust_unreachable ();
}
void
ASTLoweringExpr::visit (AST::BreakExpr &expr)
{
- HIR::Lifetime break_label
- = lower_lifetime (expr.get_label ().get_lifetime ());
+ tl::optional<HIR::Lifetime> break_label = tl::nullopt;
+ if (expr.has_label ())
+ break_label = lower_lifetime (expr.get_label_unchecked ().get_lifetime ());
+
HIR::Expr *break_expr
= expr.has_break_expr ()
? ASTLoweringExpr::translate (expr.get_break_expr ())
@@ -618,7 +620,9 @@ ASTLoweringExpr::visit (AST::BreakExpr &expr)
void
ASTLoweringExpr::visit (AST::ContinueExpr &expr)
{
- HIR::Lifetime break_label = lower_lifetime (expr.get_label ());
+ tl::optional<HIR::Lifetime> break_label;
+ if (expr.has_label ())
+ break_label = lower_lifetime (expr.get_label_unchecked ());
auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
@@ -633,9 +637,6 @@ ASTLoweringExpr::visit (AST::ContinueExpr &expr)
void
ASTLoweringExpr::visit (AST::BorrowExpr &expr)
{
- if (expr.is_raw_borrow ())
- rust_unreachable ();
-
HIR::Expr *borrow_lvalue
= ASTLoweringExpr::translate (expr.get_borrowed_expr ());
@@ -646,8 +647,8 @@ ASTLoweringExpr::visit (AST::BorrowExpr &expr)
auto *borrow_expr
= new HIR::BorrowExpr (mapping, std::unique_ptr<HIR::Expr> (borrow_lvalue),
- expr.get_mutability (), expr.get_outer_attrs (),
- expr.get_locus ());
+ expr.get_mutability (), expr.is_raw_borrow (),
+ expr.get_outer_attrs (), expr.get_locus ());
if (expr.get_is_double_borrow ())
{
@@ -659,8 +660,8 @@ ASTLoweringExpr::visit (AST::BorrowExpr &expr)
borrow_expr
= new HIR::BorrowExpr (mapping,
std::unique_ptr<HIR::Expr> (borrow_expr),
- expr.get_mutability (), expr.get_outer_attrs (),
- expr.get_locus ());
+ expr.get_mutability (), expr.is_raw_borrow (),
+ expr.get_outer_attrs (), expr.get_locus ());
}
translated = borrow_expr;
@@ -684,21 +685,6 @@ ASTLoweringExpr::visit (AST::DereferenceExpr &expr)
}
void
-ASTLoweringExpr::visit (AST::ErrorPropagationExpr &expr)
-{
- HIR::Expr *propagating_expr
- = ASTLoweringExpr::translate (expr.get_propagating_expr ());
-
- auto crate_num = mappings.get_current_crate ();
- Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings.get_next_hir_id (crate_num),
- UNKNOWN_LOCAL_DEFID);
- translated = new HIR::ErrorPropagationExpr (
- mapping, std::unique_ptr<HIR::Expr> (propagating_expr),
- expr.get_outer_attrs (), expr.get_locus ());
-}
-
-void
ASTLoweringExpr::visit (AST::MatchExpr &expr)
{
translated = ASTLoweringExprWithBlock::translate (expr, &terminated);
@@ -969,6 +955,50 @@ ASTLoweringExpr::visit (AST::InlineAsm &expr)
hir_operands, expr.get_clobber_abi (),
expr.get_options (), mapping);
}
+
+void
+ASTLoweringExpr::visit (AST::LlvmInlineAsm &expr)
+{
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ std::vector<LlvmOperand> inputs;
+ std::vector<LlvmOperand> outputs;
+
+ for (auto i : expr.get_inputs ())
+ {
+ std::unique_ptr<Expr> inner_expr
+ = std::unique_ptr<Expr> (translate (*i.expr.get ()));
+ inputs.emplace_back (i.constraint, std::move (inner_expr));
+ }
+
+ for (auto o : expr.get_outputs ())
+ {
+ std::unique_ptr<Expr> inner_expr
+ = std::unique_ptr<Expr> (translate (*o.expr.get ()));
+ outputs.emplace_back (o.constraint, std::move (inner_expr));
+ }
+
+ HIR::LlvmInlineAsm::Options options{expr.is_volatile (),
+ expr.is_stack_aligned (),
+ expr.get_dialect ()};
+
+ // We're not really supporting llvm_asm, only the bare minimum
+ // we're quite conservative here as the current code support more usecase.
+ rust_assert (outputs.size () == 0);
+ rust_assert (inputs.size () <= 1);
+ rust_assert (expr.get_clobbers ().size () <= 1);
+ rust_assert (expr.get_templates ().size () == 1);
+ rust_assert (expr.get_templates ()[0].symbol == "");
+
+ translated
+ = new HIR::LlvmInlineAsm (expr.get_locus (), inputs, outputs,
+ expr.get_templates (), expr.get_clobbers (),
+ options, expr.get_outer_attrs (), mapping);
+}
+
void
ASTLoweringExpr::visit (AST::FormatArgs &fmt)
{
diff --git a/gcc/rust/hir/rust-ast-lower-expr.h b/gcc/rust/hir/rust-ast-lower-expr.h
index fc53786..adedeb3 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.h
+++ b/gcc/rust/hir/rust-ast-lower-expr.h
@@ -113,7 +113,6 @@ public:
void visit (AST::ContinueExpr &expr) override;
void visit (AST::BorrowExpr &expr) override;
void visit (AST::DereferenceExpr &expr) override;
- void visit (AST::ErrorPropagationExpr &expr) override;
void visit (AST::MatchExpr &expr) override;
void visit (AST::RangeFromToExpr &expr) override;
void visit (AST::RangeFromExpr &expr) override;
@@ -123,6 +122,7 @@ public:
void visit (AST::ClosureExprInner &expr) override;
void visit (AST::ClosureExprInnerTyped &expr) override;
void visit (AST::InlineAsm &expr) override;
+ void visit (AST::LlvmInlineAsm &expr) override;
// Extra visitor for FormatArgs nodes
void visit (AST::FormatArgs &fmt) override;
diff --git a/gcc/rust/hir/rust-ast-lower-implitem.cc b/gcc/rust/hir/rust-ast-lower-implitem.cc
index 5380d25..d815a71 100644
--- a/gcc/rust/hir/rust-ast-lower-implitem.cc
+++ b/gcc/rust/hir/rust-ast-lower-implitem.cc
@@ -22,6 +22,7 @@
#include "rust-ast-lower-expr.h"
#include "rust-ast-lower-pattern.h"
#include "rust-ast-lower-block.h"
+#include "rust-hir-item.h"
#include "rust-item.h"
namespace Rust {
@@ -131,7 +132,7 @@ ASTLowerImplItem::visit (AST::Function &function)
Identifier function_name = function.get_function_name ();
location_t locus = function.get_locus ();
- HIR::SelfParam self_param = HIR::SelfParam::error ();
+ tl::optional<HIR::SelfParam> self_param = tl::nullopt;
if (function.has_self_param ())
self_param = lower_self (function.get_self_param ());
@@ -140,6 +141,9 @@ ASTLowerImplItem::visit (AST::Function &function)
ASTLoweringType::translate (function.get_return_type ()))
: nullptr;
+ Defaultness defaultness
+ = function.is_default () ? Defaultness::Default : Defaultness::Final;
+
std::vector<HIR::FunctionParam> function_params;
for (auto &p : function.get_function_params ())
{
@@ -183,15 +187,15 @@ ASTLowerImplItem::visit (AST::Function &function)
std::move (function_params), std::move (return_type),
std::move (where_clause), std::move (function_body),
std::move (vis), function.get_outer_attrs (),
- std::move (self_param), locus);
+ std::move (self_param), defaultness, locus);
- if (!fn->get_self_param ().is_error ())
+ if (fn->is_method ())
{
// insert mappings for self
- mappings.insert_hir_self_param (&fn->get_self_param ());
+ mappings.insert_hir_self_param (&fn->get_self_param_unchecked ());
mappings.insert_location (
- fn->get_self_param ().get_mappings ().get_hirid (),
- fn->get_self_param ().get_locus ());
+ fn->get_self_param_unchecked ().get_mappings ().get_hirid (),
+ fn->get_self_param_unchecked ().get_locus ());
}
// add the mappings for the function params at the end
@@ -245,9 +249,9 @@ ASTLowerTraitItem::visit (AST::Function &func)
// set self parameter to error if this is a method
// else lower to hir
- HIR::SelfParam self_param = func.has_self_param ()
- ? lower_self (func.get_self_param ())
- : HIR::SelfParam::error ();
+ tl::optional<HIR::SelfParam> self_param = tl::nullopt;
+ if (func.has_self_param ())
+ self_param = lower_self (func.get_self_param ());
std::vector<HIR::FunctionParam> function_params;
for (auto &p : func.get_function_params ())
@@ -299,9 +303,10 @@ ASTLowerTraitItem::visit (AST::Function &func)
if (func.has_self_param ())
{
// insert mappings for self
- mappings.insert_hir_self_param (&self_param);
- mappings.insert_location (self_param.get_mappings ().get_hirid (),
- self_param.get_locus ());
+ // TODO: Is this correct ? Looks fishy
+ mappings.insert_hir_self_param (&*self_param);
+ mappings.insert_location (self_param->get_mappings ().get_hirid (),
+ self_param->get_locus ());
}
// add the mappings for the function params at the end
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc
index ae938d9..f4396b5 100644
--- a/gcc/rust/hir/rust-ast-lower-item.cc
+++ b/gcc/rust/hir/rust-ast-lower-item.cc
@@ -451,13 +451,16 @@ ASTLoweringItem::visit (AST::Function &function)
mappings.insert_location (function_body->get_mappings ().get_hirid (),
function.get_locus ());
+ Defaultness defaultness
+ = function.is_default () ? Defaultness::Default : Defaultness::Final;
+
auto fn
= new HIR::Function (mapping, std::move (function_name),
std::move (qualifiers), std::move (generic_params),
std::move (function_params), std::move (return_type),
std::move (where_clause), std::move (function_body),
std::move (vis), function.get_outer_attrs (),
- HIR::SelfParam::error (), locus);
+ tl::nullopt, defaultness, locus);
// add the mappings for the function params at the end
for (auto &param : fn->get_function_params ())
@@ -606,17 +609,18 @@ ASTLoweringItem::visit (AST::Trait &trait)
mappings.get_next_hir_id (crate_num),
mappings.get_next_localdef_id (crate_num));
- auto trait_unsafety = Unsafety::Normal;
- if (trait.is_unsafe ())
- {
- trait_unsafety = Unsafety::Unsafe;
- }
+ auto trait_unsafety
+ = trait.is_unsafe () ? Unsafety::Unsafe : Unsafety::Normal;
HIR::Trait *hir_trait
= new HIR::Trait (mapping, trait.get_identifier (), trait_unsafety,
std::move (generic_params), std::move (type_param_bounds),
where_clause, std::move (trait_items), vis,
trait.get_outer_attrs (), trait.get_locus ());
+
+ if (trait.is_auto ())
+ mappings.insert_auto_trait (hir_trait);
+
translated = hir_trait;
for (auto trait_item_id : trait_item_ids)
diff --git a/gcc/rust/hir/rust-ast-lower-stmt.cc b/gcc/rust/hir/rust-ast-lower-stmt.cc
index fd2cdfb..dbb1723 100644
--- a/gcc/rust/hir/rust-ast-lower-stmt.cc
+++ b/gcc/rust/hir/rust-ast-lower-stmt.cc
@@ -76,20 +76,26 @@ ASTLoweringStmt::visit (AST::LetStmt &stmt)
type
= std::unique_ptr<Type> (ASTLoweringType::translate (stmt.get_type ()));
- tl::optional<std::unique_ptr<HIR::Expr>> init_expression = tl::nullopt;
+ tl::optional<std::unique_ptr<HIR::Expr>> init_expr = tl::nullopt;
+ tl::optional<std::unique_ptr<HIR::Expr>> else_expr = tl::nullopt;
if (stmt.has_init_expr ())
- init_expression = std::unique_ptr<HIR::Expr> (
+ init_expr = std::unique_ptr<HIR::Expr> (
ASTLoweringExpr::translate (stmt.get_init_expr ()));
+ if (stmt.has_else_expr ())
+ else_expr = std::unique_ptr<HIR::Expr> (
+ ASTLoweringExpr::translate (stmt.get_else_expr ()));
+
auto crate_num = mappings.get_current_crate ();
Analysis::NodeMapping mapping (crate_num, stmt.get_node_id (),
mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
translated
= new HIR::LetStmt (mapping, std::unique_ptr<HIR::Pattern> (variables),
- std::move (init_expression), std::move (type),
- stmt.get_outer_attrs (), stmt.get_locus ());
+ std::move (init_expr), std::move (else_expr),
+ std::move (type), stmt.get_outer_attrs (),
+ stmt.get_locus ());
}
void
diff --git a/gcc/rust/hir/rust-ast-lower-type.cc b/gcc/rust/hir/rust-ast-lower-type.cc
index 8df418b..a678f18 100644
--- a/gcc/rust/hir/rust-ast-lower-type.cc
+++ b/gcc/rust/hir/rust-ast-lower-type.cc
@@ -477,6 +477,42 @@ ASTLoweringType::visit (AST::ParenthesisedType &type)
type.get_locus ());
}
+void
+ASTLoweringType::visit (AST::ImplTraitType &type)
+{
+ std::vector<std::unique_ptr<HIR::TypeParamBound>> bounds;
+ for (auto &bound : type.get_type_param_bounds ())
+ {
+ auto b = ASTLoweringTypeBounds::translate (*bound.get ());
+ bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+ }
+
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ translated
+ = new HIR::ImplTraitType (mapping, std::move (bounds), type.get_locus ());
+}
+
+void
+ASTLoweringType::visit (AST::ImplTraitTypeOneBound &type)
+{
+ std::vector<std::unique_ptr<HIR::TypeParamBound>> bounds;
+
+ auto b = ASTLoweringTypeBounds::translate (type.get_trait_bound ());
+ bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ mappings.get_next_localdef_id (crate_num));
+
+ translated
+ = new HIR::ImplTraitType (mapping, std::move (bounds), type.get_locus ());
+}
+
HIR::GenericParam *
ASTLowerGenericParam::translate (AST::GenericParam &param)
{
@@ -521,7 +557,7 @@ ASTLowerGenericParam::visit (AST::ConstGenericParam &param)
HIR::Expr *default_expr = nullptr;
if (param.has_default_value ())
default_expr = ASTLoweringExpr::translate (
- param.get_default_value ().get_expression ());
+ param.get_default_value_unchecked ().get_expression ());
translated = new HIR::ConstGenericParam (param.get_name ().as_string (),
std::unique_ptr<Type> (type),
diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h
index af0b4be..4efaeee 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -82,6 +82,9 @@ public:
void visit (AST::TraitObjectType &type) override;
void visit (AST::ParenthesisedType &type) override;
+ void visit (AST::ImplTraitType &type) override;
+ void visit (AST::ImplTraitTypeOneBound &type) override;
+
private:
ASTLoweringType (bool default_to_static_lifetime)
: ASTLoweringBase (),
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index a94a843..76bd135 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -97,7 +97,11 @@ ASTLowering::go ()
void
ASTLoweringBlock::visit (AST::BlockExpr &expr)
{
- auto label = lower_loop_label (expr.get_label ());
+ tl::optional<HIR::LoopLabel> label;
+ if (expr.has_label ())
+ label = lower_loop_label (expr.get_label ());
+ else
+ label = tl::nullopt;
std::vector<std::unique_ptr<HIR::Stmt>> block_stmts;
bool block_did_terminate = false;
@@ -398,7 +402,10 @@ ASTLoweringExprWithBlock::visit (AST::WhileLoopExpr &expr)
HIR::BlockExpr *loop_block
= ASTLoweringBlock::translate (expr.get_loop_block (), &terminated);
- HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
+ tl::optional<HIR::LoopLabel> loop_label;
+ if (expr.has_loop_label ())
+ loop_label = lower_loop_label (expr.get_loop_label ());
+
HIR::Expr *loop_condition
= ASTLoweringExpr::translate (expr.get_predicate_expr (), &terminated);
@@ -418,24 +425,7 @@ ASTLoweringExprWithBlock::visit (AST::WhileLoopExpr &expr)
void
ASTLoweringExprWithBlock::visit (AST::ForLoopExpr &expr)
{
- // TODO FIXME
-
- // HIR::BlockExpr *loop_block
- // = ASTLoweringBlock::translate (expr.get_loop_block ().get (),
- // &terminated);
- // HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
- // HIR::Expr *iterator_expr
- // = ASTLoweringExpr::translate (expr.get_iterator_expr ().get (),
- // &terminated);
- // HIR::Pattern *loop_pattern
- // = ASTLoweringPattern::translate (expr.get_pattern ().get ());
-
- // auto crate_num = mappings->get_current_crate ();
- // Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- // mappings->get_next_hir_id (crate_num),
- // UNKNOWN_LOCAL_DEFID);
-
- gcc_unreachable ();
+ rust_unreachable ();
}
void
@@ -494,6 +484,18 @@ ASTLoweringExprWithBlock::visit (AST::MatchExpr &expr)
void
ASTLowerPathInExpression::visit (AST::PathInExpression &expr)
{
+ auto crate_num = mappings.get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
+ mappings.get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ if (expr.is_lang_item ())
+ {
+ translated = new HIR::PathInExpression (mapping, expr.get_lang_item (),
+ expr.get_locus (), false);
+ return;
+ }
+
std::vector<HIR::PathExprSegment> path_segments;
auto &segments = expr.get_segments ();
for (auto &s : segments)
@@ -504,10 +506,6 @@ ASTLowerPathInExpression::visit (AST::PathInExpression &expr)
HIR::PathExprSegment *lowered_seg = &path_segments.back ();
mappings.insert_hir_path_expr_seg (lowered_seg);
}
- auto crate_num = mappings.get_current_crate ();
- Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
- mappings.get_next_hir_id (crate_num),
- UNKNOWN_LOCAL_DEFID);
translated = new HIR::PathInExpression (mapping, std::move (path_segments),
expr.get_locus (),
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index 798179d..cb32f68 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -315,6 +315,14 @@ Dump::do_functionparam (FunctionParam &e)
void
Dump::do_pathpattern (PathPattern &e)
{
+ if (e.get_path_kind () == PathPattern::Kind::LangItem)
+ {
+ put_field ("segments", "#[lang = \""
+ + LangItem::ToString (e.get_lang_item ())
+ + "\"]");
+ return;
+ }
+
std::string str = "";
for (const auto &segment : e.get_segments ())
@@ -388,7 +396,10 @@ void
Dump::do_typepathsegment (TypePathSegment &e)
{
do_mappings (e.get_mappings ());
- put_field ("ident_segment", e.get_ident_segment ().as_string ());
+ if (e.is_lang_item ())
+ put_field ("ident_segment", LangItem::PrettyString (e.get_lang_item ()));
+ else
+ put_field ("ident_segment", e.get_ident_segment ().as_string ());
}
void
@@ -402,9 +413,12 @@ void
Dump::do_qualifiedpathtype (QualifiedPathType &e)
{
do_mappings (e.get_mappings ());
- visit_field ("type", e.get_type ());
+ if (e.has_type ())
+ visit_field ("type", e.get_type ());
+ else
+ put_field ("type", "none");
- if (e.has_as_clause ())
+ if (e.has_trait ())
visit_field ("trait", e.get_trait ());
}
@@ -524,13 +538,16 @@ Dump::do_traitfunctiondecl (TraitFunctionDecl &e)
if (e.has_return_type ())
visit_field ("return_type", e.get_return_type ());
+ else
+ put_field ("return_type", "none");
if (e.has_where_clause ())
put_field ("where_clause", e.get_where_clause ().as_string ());
else
put_field ("where_clause", "none");
- put_field ("self", e.get_self ().as_string ());
+ if (e.is_method ())
+ put_field ("self", e.get_self_unchecked ().as_string ());
end ("TraitFunctionDecl");
}
@@ -1267,7 +1284,9 @@ Dump::visit (BlockExpr &e)
do_expr (e);
do_inner_attrs (e);
put_field ("tail_reachable", std::to_string (e.is_tail_reachable ()));
- put_field ("label", e.get_label ().as_string ());
+
+ if (e.has_label ())
+ put_field ("label", e.get_label ().as_string ());
visit_collection ("statements", e.get_statements ());
@@ -1303,6 +1322,8 @@ Dump::visit (BreakExpr &e)
if (e.has_break_expr ())
visit_field ("break_expr ", e.get_expr ());
+ else
+ put_field ("break_expr", "none");
end ("BreakExpr");
}
@@ -1489,6 +1510,10 @@ Dump::visit (InlineAsm &e)
{}
void
+Dump::visit (LlvmInlineAsm &e)
+{}
+
+void
Dump::visit (TypeParam &e)
{
begin ("TypeParam");
@@ -1675,7 +1700,8 @@ Dump::visit (Function &e)
put_field ("where clause", e.get_where_clause ().as_string ());
visit_field ("function_body", e.get_definition ());
- put_field ("self", e.get_self_param ().as_string ());
+ if (e.is_method ())
+ put_field ("self", e.get_self_param_unchecked ().as_string ());
end ("Function");
}
@@ -1914,7 +1940,9 @@ Dump::visit (TraitItemConst &e)
put_field ("name", e.get_name ().as_string ());
visit_field ("type", e.get_type ());
- visit_field ("expr", e.get_expr ());
+ if (e.has_expr ())
+ visit_field ("expr", e.get_expr ());
+
end ("TraitItemConst");
}
@@ -2330,15 +2358,6 @@ Dump::visit (ParenthesisedType &e)
}
void
-Dump::visit (ImplTraitTypeOneBound &e)
-{
- begin ("ImplTraitTypeOneBound");
- do_type (e);
- visit_field ("trait_bound", e.get_trait_bound ());
- end ("ImplTraitTypeOneBound");
-}
-
-void
Dump::visit (TupleType &e)
{
begin ("TupleType");
@@ -2429,7 +2448,9 @@ Dump::visit (BareFunctionType &e)
end_field ("params");
}
- visit_field ("return_type", e.get_return_type ());
+ if (e.has_return_type ())
+ visit_field ("return_type", e.get_return_type ());
+
put_field ("is_variadic", std::to_string (e.get_is_variadic ()));
end ("BareFunctionType");
}
diff --git a/gcc/rust/hir/rust-hir-dump.h b/gcc/rust/hir/rust-hir-dump.h
index 8683dee..45b1708 100644
--- a/gcc/rust/hir/rust-hir-dump.h
+++ b/gcc/rust/hir/rust-hir-dump.h
@@ -166,6 +166,7 @@ private:
virtual void visit (AwaitExpr &) override;
virtual void visit (AsyncBlockExpr &) override;
virtual void visit (InlineAsm &) override;
+ virtual void visit (LlvmInlineAsm &) override;
virtual void visit (TypeParam &) override;
virtual void visit (ConstGenericParam &) override;
@@ -237,7 +238,6 @@ private:
virtual void visit (ImplTraitType &) override;
virtual void visit (TraitObjectType &) override;
virtual void visit (ParenthesisedType &) override;
- virtual void visit (ImplTraitTypeOneBound &) override;
virtual void visit (TupleType &) override;
virtual void visit (NeverType &) override;
virtual void visit (RawPointerType &) override;
diff --git a/gcc/rust/hir/tree/rust-hir-bound.h b/gcc/rust/hir/tree/rust-hir-bound.h
index 78bb133..8fa6a22 100644
--- a/gcc/rust/hir/tree/rust-hir-bound.h
+++ b/gcc/rust/hir/tree/rust-hir-bound.h
@@ -44,18 +44,6 @@ public:
{}
// Returns true if the lifetime is in an error state.
- bool is_error () const
- {
- return lifetime_type == AST::Lifetime::LifetimeType::NAMED
- && lifetime_name.empty ();
- }
-
- static Lifetime error ()
- {
- return Lifetime (Analysis::NodeMapping::get_error (),
- AST::Lifetime::LifetimeType::NAMED, "", UNDEF_LOCATION);
- }
-
std::string as_string () const override;
void accept_vis (HIRFullVisitor &vis) override;
diff --git a/gcc/rust/hir/tree/rust-hir-expr-abstract.h b/gcc/rust/hir/tree/rust-hir-expr-abstract.h
index ecf9bd1..5bc5d89 100644
--- a/gcc/rust/hir/tree/rust-hir-expr-abstract.h
+++ b/gcc/rust/hir/tree/rust-hir-expr-abstract.h
@@ -71,6 +71,7 @@ public:
AsyncBlock,
Path,
InlineAsm,
+ LlvmInlineAsm,
};
BaseKind get_hir_kind () override final { return Node::BaseKind::EXPR; }
diff --git a/gcc/rust/hir/tree/rust-hir-expr.cc b/gcc/rust/hir/tree/rust-hir-expr.cc
index 2ded789..266c79c 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.cc
+++ b/gcc/rust/hir/tree/rust-hir-expr.cc
@@ -81,10 +81,10 @@ OperatorExpr::operator= (OperatorExpr const &other)
BorrowExpr::BorrowExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> borrow_lvalue, Mutability mut,
- AST::AttrVec outer_attribs, location_t locus)
+ bool raw, AST::AttrVec outer_attribs, location_t locus)
: OperatorExpr (std::move (mappings), std::move (borrow_lvalue),
std::move (outer_attribs), locus),
- mut (mut)
+ mut (mut), raw (raw)
{}
DereferenceExpr::DereferenceExpr (Analysis::NodeMapping mappings,
@@ -749,7 +749,7 @@ BlockExpr::BlockExpr (Analysis::NodeMapping mappings,
std::vector<std::unique_ptr<Stmt>> block_statements,
std::unique_ptr<Expr> block_expr, bool tail_reachable,
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
- LoopLabel label, location_t start_locus,
+ tl::optional<LoopLabel> label, location_t start_locus,
location_t end_locus)
: ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
WithInnerAttrs (std::move (inner_attribs)),
@@ -791,13 +791,15 @@ BlockExpr::operator= (BlockExpr const &other)
}
ContinueExpr::ContinueExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime label, AST::AttrVec outer_attribs)
+ tl::optional<Lifetime> label,
+ AST::AttrVec outer_attribs)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
label (std::move (label)), locus (locus)
{}
BreakExpr::BreakExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime break_label, std::unique_ptr<Expr> expr_in_break,
+ tl::optional<Lifetime> break_label,
+ std::unique_ptr<Expr> expr_in_break,
AST::AttrVec outer_attribs)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
label (std::move (break_label)), break_expr (std::move (expr_in_break)),
@@ -985,7 +987,8 @@ UnsafeBlockExpr::operator= (UnsafeBlockExpr const &other)
BaseLoopExpr::BaseLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block,
- location_t locus, LoopLabel loop_label,
+ location_t locus,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs)
: ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
loop_label (std::move (loop_label)), loop_block (std::move (loop_block)),
@@ -1011,7 +1014,8 @@ BaseLoopExpr::operator= (BaseLoopExpr const &other)
LoopExpr::LoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label, AST::AttrVec outer_attribs)
+ tl::optional<LoopLabel> loop_label,
+ AST::AttrVec outer_attribs)
: BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
std::move (loop_label), std::move (outer_attribs))
{}
@@ -1019,7 +1023,8 @@ LoopExpr::LoopExpr (Analysis::NodeMapping mappings,
WhileLoopExpr::WhileLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> loop_condition,
std::unique_ptr<BlockExpr> loop_block,
- location_t locus, LoopLabel loop_label,
+ location_t locus,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs)
: BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
std::move (loop_label), std::move (outer_attribs)),
@@ -1046,7 +1051,8 @@ WhileLetLoopExpr::WhileLetLoopExpr (
Analysis::NodeMapping mappings,
std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
std::unique_ptr<Expr> condition, std::unique_ptr<BlockExpr> loop_block,
- location_t locus, LoopLabel loop_label, AST::AttrVec outer_attribs)
+ location_t locus, tl::optional<LoopLabel> loop_label,
+ AST::AttrVec outer_attribs)
: BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
std::move (loop_label), std::move (outer_attribs)),
match_arm_patterns (std::move (match_arm_patterns)),
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h
index f8f2128..375f474 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -45,9 +45,6 @@ public:
LoopLabel (Analysis::NodeMapping mapping, Lifetime loop_label,
location_t locus);
- // Returns whether the LoopLabel is in an error state.
- bool is_error () const { return label.is_error (); }
-
location_t get_locus () const { return locus; }
Analysis::NodeMapping &get_mappings () { return mappings; }
@@ -199,12 +196,13 @@ public:
class BorrowExpr : public OperatorExpr
{
Mutability mut;
+ bool raw;
public:
std::string as_string () const override;
BorrowExpr (Analysis::NodeMapping mappings,
- std::unique_ptr<Expr> borrow_lvalue, Mutability mut,
+ std::unique_ptr<Expr> borrow_lvalue, Mutability mut, bool raw,
AST::AttrVec outer_attribs, location_t locus);
void accept_vis (HIRFullVisitor &vis) override;
@@ -212,6 +210,7 @@ public:
Mutability get_mut () const { return mut; }
bool is_mut () const { return mut == Mutability::Mut; }
+ bool is_raw_borrow () const { return raw; }
protected:
/* Use covariance to implement clone function as returning this object rather
@@ -1715,7 +1714,7 @@ public:
std::vector<std::unique_ptr<Stmt>> statements;
std::unique_ptr<Expr> expr;
bool tail_reachable;
- LoopLabel label;
+ tl::optional<LoopLabel> label;
location_t start_locus;
location_t end_locus;
@@ -1735,7 +1734,8 @@ public:
std::vector<std::unique_ptr<Stmt>> block_statements,
std::unique_ptr<Expr> block_expr, bool tail_reachable,
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
- LoopLabel label, location_t start_locus, location_t end_locus);
+ tl::optional<LoopLabel> label, location_t start_locus,
+ location_t end_locus);
// Copy constructor with clone
BlockExpr (BlockExpr const &other);
@@ -1774,8 +1774,8 @@ public:
return ExprType::Block;
}
- bool has_label () const { return !label.is_error (); }
- LoopLabel &get_label () { return label; }
+ bool has_label () const { return label.has_value (); }
+ LoopLabel &get_label () { return label.value (); }
protected:
/* Use covariance to implement clone function as returning this object rather
@@ -1803,25 +1803,27 @@ protected:
// HIR node representing continue expression within loops
class ContinueExpr : public ExprWithoutBlock
{
- Lifetime label;
+ tl::optional<Lifetime> label;
location_t locus;
public:
std::string as_string () const override;
// Returns true if the continue expr has a label.
- bool has_label () const { return !label.is_error (); }
+ bool has_label () const { return label.has_value (); }
// Constructor for a ContinueExpr with a label.
ContinueExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime label, AST::AttrVec outer_attribs = AST::AttrVec ());
+ tl::optional<Lifetime> label,
+ AST::AttrVec outer_attribs = AST::AttrVec ());
location_t get_locus () const override final { return locus; }
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRExpressionVisitor &vis) override;
- Lifetime &get_label () { return label; }
+ Lifetime &get_label () { return label.value (); }
+ const Lifetime &get_label () const { return label.value (); }
ExprType get_expression_type () const final override
{
@@ -1848,7 +1850,7 @@ protected:
class BreakExpr : public ExprWithoutBlock
{
// bool has_label;
- Lifetime label;
+ tl::optional<Lifetime> label;
// bool has_break_expr;
std::unique_ptr<Expr> break_expr;
@@ -1859,7 +1861,7 @@ public:
std::string as_string () const override;
// Returns whether the break expression has a label or not.
- bool has_label () const { return !label.is_error (); }
+ bool has_label () const { return label.has_value (); }
/* Returns whether the break expression has an expression used in the break or
* not. */
@@ -1867,7 +1869,7 @@ public:
// Constructor for a break expression
BreakExpr (Analysis::NodeMapping mappings, location_t locus,
- Lifetime break_label,
+ tl::optional<Lifetime> break_label,
std::unique_ptr<Expr> expr_in_break = nullptr,
AST::AttrVec outer_attribs = AST::AttrVec ());
@@ -1886,7 +1888,8 @@ public:
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRExpressionVisitor &vis) override;
- Lifetime &get_label () { return label; }
+ Lifetime &get_label () { return label.value (); }
+ const Lifetime &get_label () const { return label.value (); }
Expr &get_expr () { return *break_expr; }
@@ -2293,7 +2296,7 @@ protected:
class BaseLoopExpr : public ExprWithBlock
{
protected:
- LoopLabel loop_label;
+ tl::optional<LoopLabel> loop_label;
std::unique_ptr<BlockExpr> loop_block;
private:
@@ -2303,7 +2306,7 @@ protected:
// Constructor for BaseLoopExpr
BaseLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs = AST::AttrVec ());
// Copy constructor for BaseLoopExpr with clone
@@ -2322,13 +2325,14 @@ protected:
}
public:
- bool has_loop_label () const { return !loop_label.is_error (); }
+ bool has_loop_label () const { return loop_label.has_value (); }
location_t get_locus () const override final { return locus; }
HIR::BlockExpr &get_loop_block () { return *loop_block; };
- LoopLabel &get_loop_label () { return loop_label; }
+ LoopLabel &get_loop_label () { return loop_label.value (); }
+ const LoopLabel &get_loop_label () const { return loop_label.value (); }
};
// 'Loop' expression (i.e. the infinite loop) HIR node
@@ -2340,7 +2344,8 @@ public:
// Constructor for LoopExpr
LoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label, AST::AttrVec outer_attribs = AST::AttrVec ());
+ tl::optional<LoopLabel> loop_label,
+ AST::AttrVec outer_attribs = AST::AttrVec ());
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRExpressionVisitor &vis) override;
@@ -2370,7 +2375,7 @@ public:
WhileLoopExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> loop_condition,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs = AST::AttrVec ());
// Copy constructor with clone
@@ -2419,7 +2424,7 @@ public:
std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
std::unique_ptr<Expr> condition,
std::unique_ptr<BlockExpr> loop_block, location_t locus,
- LoopLabel loop_label,
+ tl::optional<LoopLabel> loop_label,
AST::AttrVec outer_attribs = AST::AttrVec ());
// Copy constructor with clone
@@ -3113,6 +3118,80 @@ public:
AST::AttrVec outer_attribs = AST::AttrVec ());
};
+struct LlvmOperand
+{
+ std::string constraint;
+ std::unique_ptr<Expr> expr;
+
+ LlvmOperand (std::string constraint, std::unique_ptr<Expr> &&expr)
+ : constraint (constraint), expr (std::move (expr))
+ {}
+
+ LlvmOperand (const LlvmOperand &other)
+ : constraint (other.constraint), expr (other.expr->clone_expr ())
+ {}
+ LlvmOperand &operator= (const LlvmOperand &other)
+ {
+ constraint = other.constraint;
+ expr = other.expr->clone_expr ();
+
+ return *this;
+ }
+};
+
+class LlvmInlineAsm : public ExprWithoutBlock
+{
+public:
+ struct Options
+ {
+ bool is_volatile;
+ bool align_stack;
+ AST::LlvmInlineAsm::Dialect dialect;
+ };
+
+ location_t locus;
+ AST::AttrVec outer_attrs;
+ std::vector<LlvmOperand> inputs;
+ std::vector<LlvmOperand> outputs;
+ std::vector<AST::TupleTemplateStr> templates;
+ std::vector<AST::TupleClobber> clobbers;
+ Options options;
+
+ LlvmInlineAsm (location_t locus, std::vector<LlvmOperand> inputs,
+ std::vector<LlvmOperand> outputs,
+ std::vector<AST::TupleTemplateStr> templates,
+ std::vector<AST::TupleClobber> clobbers, Options options,
+ AST::AttrVec outer_attrs, Analysis::NodeMapping mappings)
+ : ExprWithoutBlock (mappings, std::move (outer_attrs)), locus (locus),
+ inputs (std::move (inputs)), outputs (std::move (outputs)),
+ templates (std::move (templates)), clobbers (std::move (clobbers)),
+ options (options)
+ {}
+
+ AST::LlvmInlineAsm::Dialect get_dialect () { return options.dialect; }
+
+ location_t get_locus () const override { return locus; }
+
+ std::vector<AST::Attribute> &get_outer_attrs () { return outer_attrs; }
+
+ void accept_vis (HIRFullVisitor &vis) override;
+ void accept_vis (HIRExpressionVisitor &vis) override;
+
+ LlvmInlineAsm *clone_expr_without_block_impl () const override
+ {
+ return new LlvmInlineAsm (*this);
+ }
+
+ std::vector<AST::TupleTemplateStr> &get_templates () { return templates; }
+
+ Expr::ExprType get_expression_type () const override
+ {
+ return Expr::ExprType::LlvmInlineAsm;
+ }
+
+ std::vector<AST::TupleClobber> get_clobbers () { return clobbers; }
+};
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h b/gcc/rust/hir/tree/rust-hir-full-decls.h
index c64c8bf..1e313ec 100644
--- a/gcc/rust/hir/tree/rust-hir-full-decls.h
+++ b/gcc/rust/hir/tree/rust-hir-full-decls.h
@@ -126,6 +126,7 @@ class InlineAsmRegClass;
struct AnonConst;
class InlineAsmOperand;
class InlineAsm;
+class LlvmInlineAsm;
// rust-stmt.h
class EmptyStmt;
@@ -211,7 +212,6 @@ class TraitBound;
class ImplTraitType;
class TraitObjectType;
class ParenthesisedType;
-class ImplTraitTypeOneBound;
class TupleType;
class NeverType;
class RawPointerType;
diff --git a/gcc/rust/hir/tree/rust-hir-generic-param.h b/gcc/rust/hir/tree/rust-hir-generic-param.h
index a1c59bf..960de56 100644
--- a/gcc/rust/hir/tree/rust-hir-generic-param.h
+++ b/gcc/rust/hir/tree/rust-hir-generic-param.h
@@ -97,9 +97,6 @@ public:
AST::AttrVec &get_outer_attrs () override { return outer_attrs; }
- // Returns whether the lifetime param is in an error state.
- bool is_error () const { return lifetime.is_error (); }
-
// Constructor
LifetimeParam (Analysis::NodeMapping mappings, Lifetime lifetime,
location_t locus = UNDEF_LOCATION,
diff --git a/gcc/rust/hir/tree/rust-hir-item.cc b/gcc/rust/hir/tree/rust-hir-item.cc
index cff06d3..160f710 100644
--- a/gcc/rust/hir/tree/rust-hir-item.cc
+++ b/gcc/rust/hir/tree/rust-hir-item.cc
@@ -123,7 +123,8 @@ TypeBoundWhereClauseItem::get_type_param_bounds ()
}
SelfParam::SelfParam (Analysis::NodeMapping mappings,
- ImplicitSelfKind self_kind, Lifetime lifetime, Type *type)
+ ImplicitSelfKind self_kind,
+ tl::optional<Lifetime> lifetime, Type *type)
: self_kind (self_kind), lifetime (std::move (lifetime)), type (type),
mappings (mappings)
{}
@@ -131,13 +132,13 @@ SelfParam::SelfParam (Analysis::NodeMapping mappings,
SelfParam::SelfParam (Analysis::NodeMapping mappings,
std::unique_ptr<Type> type, bool is_mut, location_t locus)
: self_kind (is_mut ? ImplicitSelfKind::MUT : ImplicitSelfKind::IMM),
- lifetime (
- Lifetime (mappings, AST::Lifetime::LifetimeType::NAMED, "", locus)),
- type (std::move (type)), locus (locus), mappings (mappings)
+ lifetime (tl::nullopt), type (std::move (type)), locus (locus),
+ mappings (mappings)
{}
-SelfParam::SelfParam (Analysis::NodeMapping mappings, Lifetime lifetime,
- bool is_mut, location_t locus)
+SelfParam::SelfParam (Analysis::NodeMapping mappings,
+ tl::optional<Lifetime> lifetime, bool is_mut,
+ location_t locus)
: self_kind (is_mut ? ImplicitSelfKind::MUT_REF : ImplicitSelfKind::IMM_REF),
lifetime (std::move (lifetime)), locus (locus), mappings (mappings)
{}
@@ -263,7 +264,8 @@ Function::Function (Analysis::NodeMapping mappings, Identifier function_name,
std::vector<FunctionParam> function_params,
std::unique_ptr<Type> return_type, WhereClause where_clause,
std::unique_ptr<BlockExpr> function_body, Visibility vis,
- AST::AttrVec outer_attrs, SelfParam self, location_t locus)
+ AST::AttrVec outer_attrs, tl::optional<SelfParam> self,
+ Defaultness defaultness, location_t locus)
: VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)),
qualifiers (std::move (qualifiers)),
function_name (std::move (function_name)),
@@ -272,7 +274,7 @@ Function::Function (Analysis::NodeMapping mappings, Identifier function_name,
return_type (std::move (return_type)),
where_clause (std::move (where_clause)),
function_body (std::move (function_body)), self (std::move (self)),
- locus (locus)
+ locus (locus), defaultness (defaultness)
{}
Function::Function (Function const &other)
@@ -280,7 +282,7 @@ Function::Function (Function const &other)
function_name (other.function_name),
function_params (other.function_params), where_clause (other.where_clause),
function_body (other.function_body->clone_block_expr ()), self (other.self),
- locus (other.locus)
+ locus (other.locus), defaultness (other.defaultness)
{
// guard to prevent null dereference (always required)
if (other.return_type != nullptr)
@@ -312,6 +314,8 @@ Function::operator= (Function const &other)
locus = other.locus;
self = other.self;
+ defaultness = other.defaultness;
+
generic_params.reserve (other.generic_params.size ());
for (const auto &e : other.generic_params)
generic_params.push_back (e->clone_generic_param ());
@@ -609,9 +613,9 @@ StaticItem::operator= (StaticItem const &other)
TraitFunctionDecl::TraitFunctionDecl (
Identifier function_name, FunctionQualifiers qualifiers,
- std::vector<std::unique_ptr<GenericParam>> generic_params, SelfParam self,
- std::vector<FunctionParam> function_params, std::unique_ptr<Type> return_type,
- WhereClause where_clause)
+ std::vector<std::unique_ptr<GenericParam>> generic_params,
+ tl::optional<SelfParam> self, std::vector<FunctionParam> function_params,
+ std::unique_ptr<Type> return_type, WhereClause where_clause)
: qualifiers (std::move (qualifiers)),
function_name (std::move (function_name)),
generic_params (std::move (generic_params)),
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h
index 4744717..37f599c 100644
--- a/gcc/rust/hir/tree/rust-hir-item.h
+++ b/gcc/rust/hir/tree/rust-hir-item.h
@@ -371,13 +371,13 @@ public:
private:
ImplicitSelfKind self_kind;
- Lifetime lifetime;
+ tl::optional<Lifetime> lifetime;
std::unique_ptr<Type> type;
location_t locus;
Analysis::NodeMapping mappings;
SelfParam (Analysis::NodeMapping mappings, ImplicitSelfKind self_kind,
- Lifetime lifetime, Type *type);
+ tl::optional<Lifetime> lifetime, Type *type);
public:
// Type-based self parameter (not ref, no lifetime)
@@ -385,8 +385,8 @@ public:
bool is_mut, location_t locus);
// Lifetime-based self parameter (is ref, no type)
- SelfParam (Analysis::NodeMapping mappings, Lifetime lifetime, bool is_mut,
- location_t locus);
+ SelfParam (Analysis::NodeMapping mappings, tl::optional<Lifetime> lifetime,
+ bool is_mut, location_t locus);
// Copy constructor requires clone
SelfParam (SelfParam const &other);
@@ -398,22 +398,13 @@ public:
SelfParam (SelfParam &&other) = default;
SelfParam &operator= (SelfParam &&other) = default;
- static SelfParam error ()
- {
- return SelfParam (Analysis::NodeMapping::get_error (),
- ImplicitSelfKind::NONE, Lifetime::error (), nullptr);
- }
-
// Returns whether the self-param has a type field.
bool has_type () const { return type != nullptr; }
// Returns whether the self-param has a valid lifetime.
- bool has_lifetime () const { return !lifetime.is_error (); }
-
- const Lifetime &get_lifetime () const { return lifetime; }
+ bool has_lifetime () const { return lifetime.has_value (); }
- // Returns whether the self-param is in an error state.
- bool is_error () const { return self_kind == ImplicitSelfKind::NONE; }
+ const Lifetime &get_lifetime () const { return lifetime.value (); }
std::string as_string () const;
@@ -945,6 +936,12 @@ protected:
class LetStmt;
+enum class Defaultness
+{
+ Default,
+ Final,
+};
+
// Rust function declaration HIR node
class Function : public VisItem, public ImplItem
{
@@ -955,9 +952,14 @@ class Function : public VisItem, public ImplItem
std::unique_ptr<Type> return_type;
WhereClause where_clause;
std::unique_ptr<BlockExpr> function_body;
- SelfParam self;
+ tl::optional<SelfParam> self;
location_t locus;
+ // NOTE: This should be moved to the trait item base class once we start
+ // implementing specialization for real, instead of just stubbing out the
+ // feature
+ Defaultness defaultness;
+
public:
std::string as_string () const override;
@@ -973,6 +975,9 @@ public:
// Returns whether function has a where clause.
bool has_where_clause () const { return !where_clause.is_empty (); }
+ // Returns whether function has a default qualifier
+ bool is_default () const { return defaultness == Defaultness::Default; }
+
ImplItemType get_impl_item_type () const override final
{
return ImplItem::ImplItemType::FUNCTION;
@@ -987,7 +992,8 @@ public:
std::vector<FunctionParam> function_params,
std::unique_ptr<Type> return_type, WhereClause where_clause,
std::unique_ptr<BlockExpr> function_body, Visibility vis,
- AST::AttrVec outer_attrs, SelfParam self, location_t locus);
+ AST::AttrVec outer_attrs, tl::optional<SelfParam> self,
+ Defaultness defaultness, location_t locus);
// Copy constructor with clone
Function (Function const &other);
@@ -1041,9 +1047,13 @@ public:
// TODO: is this better? Or is a "vis_block" better?
Type &get_return_type () { return *return_type; }
- bool is_method () const { return !self.is_error (); }
+ bool is_method () const { return self.has_value (); }
- SelfParam &get_self_param () { return self; }
+ tl::optional<SelfParam> &get_self_param () { return self; }
+ const tl::optional<SelfParam> &get_self_param () const { return self; }
+
+ SelfParam &get_self_param_unchecked () { return self.value (); }
+ const SelfParam &get_self_param_unchecked () const { return self.value (); }
std::string get_impl_item_name () const override final
{
@@ -1898,13 +1908,14 @@ private:
std::vector<FunctionParam> function_params;
std::unique_ptr<Type> return_type;
WhereClause where_clause;
- SelfParam self;
+ tl::optional<SelfParam> self;
public:
// Mega-constructor
TraitFunctionDecl (Identifier function_name, FunctionQualifiers qualifiers,
std::vector<std::unique_ptr<GenericParam>> generic_params,
- SelfParam self, std::vector<FunctionParam> function_params,
+ tl::optional<SelfParam> self,
+ std::vector<FunctionParam> function_params,
std::unique_ptr<Type> return_type,
WhereClause where_clause);
@@ -1936,9 +1947,13 @@ public:
WhereClause &get_where_clause () { return where_clause; }
- bool is_method () const { return !self.is_error (); }
+ bool is_method () const { return self.has_value (); }
+
+ SelfParam &get_self_unchecked () { return self.value (); }
+ const SelfParam &get_self_unchecked () const { return self.value (); }
- SelfParam &get_self () { return self; }
+ tl::optional<SelfParam> &get_self () { return self; }
+ const tl::optional<SelfParam> &get_self () const { return self; }
Identifier get_function_name () const { return function_name; }
@@ -2055,6 +2070,8 @@ public:
Identifier get_name () const { return name; }
+ bool has_type () const { return expr != nullptr; }
+
bool has_expr () const { return expr != nullptr; }
Type &get_type ()
diff --git a/gcc/rust/hir/tree/rust-hir-path.cc b/gcc/rust/hir/tree/rust-hir-path.cc
index 7db2b25..ee4a572 100644
--- a/gcc/rust/hir/tree/rust-hir-path.cc
+++ b/gcc/rust/hir/tree/rust-hir-path.cc
@@ -133,6 +133,8 @@ PathExprSegment::operator= (PathExprSegment const &other)
void
PathPattern::iterate_path_segments (std::function<bool (PathExprSegment &)> cb)
{
+ rust_assert (kind == Kind::Segmented);
+
for (auto it = segments.begin (); it != segments.end (); it++)
{
if (!cb (*it))
@@ -150,6 +152,15 @@ PathInExpression::PathInExpression (Analysis::NodeMapping mappings,
has_opening_scope_resolution (has_opening_scope_resolution), locus (locus)
{}
+PathInExpression::PathInExpression (Analysis::NodeMapping mappings,
+ LangItem::Kind lang_item, location_t locus,
+ bool has_opening_scope_resolution,
+ std::vector<AST::Attribute> outer_attrs)
+ : PathPattern (lang_item),
+ PathExpr (std::move (mappings), std::move (outer_attrs)),
+ has_opening_scope_resolution (has_opening_scope_resolution), locus (locus)
+{}
+
bool
PathInExpression::is_self () const
@@ -358,6 +369,15 @@ QualifiedPathInExpression::QualifiedPathInExpression (
path_type (std::move (qual_path_type)), locus (locus)
{}
+QualifiedPathInExpression::QualifiedPathInExpression (
+ Analysis::NodeMapping mappings, QualifiedPathType qual_path_type,
+ LangItem::Kind lang_item, location_t locus,
+ std::vector<AST::Attribute> outer_attrs)
+ : PathPattern (lang_item),
+ PathExpr (std::move (mappings), std::move (outer_attrs)),
+ path_type (std::move (qual_path_type)), locus (locus)
+{}
+
QualifiedPathInType::QualifiedPathInType (
Analysis::NodeMapping mappings, QualifiedPathType qual_path_type,
std::unique_ptr<TypePathSegment> associated_segment,
diff --git a/gcc/rust/hir/tree/rust-hir-path.h b/gcc/rust/hir/tree/rust-hir-path.h
index bbb9c2d..3ce2662 100644
--- a/gcc/rust/hir/tree/rust-hir-path.h
+++ b/gcc/rust/hir/tree/rust-hir-path.h
@@ -19,6 +19,7 @@
#ifndef RUST_HIR_PATH_H
#define RUST_HIR_PATH_H
+#include "rust-hir-map.h"
#include "rust-hir-simple-path.h"
#include "rust-hir-type-no-bounds.h"
#include "rust-hir-pattern-abstract.h"
@@ -230,15 +231,34 @@ public:
// HIR node representing a pattern that involves a "path" - abstract base class
class PathPattern : public Pattern
{
+public:
+ enum class Kind
+ {
+ Segmented,
+ LangItem
+ };
+
+private:
std::vector<PathExprSegment> segments;
+ tl::optional<LangItem::Kind> lang_item;
+ Kind kind;
protected:
PathPattern (std::vector<PathExprSegment> segments)
- : segments (std::move (segments))
+ : segments (std::move (segments)), lang_item (tl::nullopt),
+ kind (Kind::Segmented)
+ {}
+
+ PathPattern (LangItem::Kind lang_item)
+ : segments ({}), lang_item (lang_item), kind (Kind::LangItem)
{}
// Returns whether path has segments.
- bool has_segments () const { return !segments.empty (); }
+ bool has_segments () const
+ {
+ rust_assert (kind == Kind::Segmented);
+ return !segments.empty ();
+ }
/* Converts path segments to their equivalent SimplePath segments if possible,
* and creates a SimplePath from them. */
@@ -248,26 +268,61 @@ protected:
public:
/* Returns whether the path is a single segment (excluding qualified path
* initial as segment). */
- bool is_single_segment () const { return segments.size () == 1; }
+ bool is_single_segment () const
+ {
+ rust_assert (kind == Kind::Segmented);
+ return segments.size () == 1;
+ }
std::string as_string () const override;
void iterate_path_segments (std::function<bool (PathExprSegment &)> cb);
- size_t get_num_segments () const { return segments.size (); }
+ size_t get_num_segments () const
+ {
+ rust_assert (kind == Kind::Segmented);
+ return segments.size ();
+ }
+
+ std::vector<PathExprSegment> &get_segments ()
+ {
+ rust_assert (kind == Kind::Segmented);
+ return segments;
+ }
+
+ const std::vector<PathExprSegment> &get_segments () const
+ {
+ rust_assert (kind == Kind::Segmented);
+ return segments;
+ }
- std::vector<PathExprSegment> &get_segments () { return segments; }
+ PathExprSegment &get_root_seg ()
+ {
+ rust_assert (kind == Kind::Segmented);
+ return segments.at (0);
+ }
- const std::vector<PathExprSegment> &get_segments () const { return segments; }
+ const PathExprSegment &get_final_segment () const
+ {
+ rust_assert (kind == Kind::Segmented);
+ return segments.back ();
+ }
- PathExprSegment &get_root_seg () { return segments.at (0); }
+ LangItem::Kind get_lang_item () const
+ {
+ rust_assert (kind == Kind::LangItem);
- const PathExprSegment &get_final_segment () const { return segments.back (); }
+ return *lang_item;
+ }
PatternType get_pattern_type () const override final
{
return PatternType::PATH;
}
+
+ bool is_lang_item () const { return kind == Kind::LangItem; }
+
+ Kind get_path_kind () const { return kind; }
};
/* HIR node representing a path-in-expression pattern (path that allows generic
@@ -288,6 +343,13 @@ public:
std::vector<AST::Attribute> outer_attrs
= std::vector<AST::Attribute> ());
+ // lang-item Constructor
+ PathInExpression (Analysis::NodeMapping mappings, LangItem::Kind kind,
+ location_t locus = UNDEF_LOCATION,
+ bool has_opening_scope_resolution = false,
+ std::vector<AST::Attribute> outer_attrs
+ = std::vector<AST::Attribute> ());
+
// Creates an error state path in expression.
static PathInExpression create_error ()
{
@@ -671,13 +733,20 @@ public:
Analysis::NodeMapping get_mappings () const { return mappings; }
+ bool has_type () { return type != nullptr; }
+ bool has_trait () { return trait != nullptr; }
+
Type &get_type ()
{
rust_assert (type);
return *type;
}
- TypePath &get_trait () { return *trait; }
+ TypePath &get_trait ()
+ {
+ rust_assert (trait);
+ return *trait;
+ }
bool trait_has_generic_args () const;
@@ -701,6 +770,14 @@ public:
std::vector<AST::Attribute> outer_attrs
= std::vector<AST::Attribute> ());
+ // lang-item constructor
+ QualifiedPathInExpression (Analysis::NodeMapping mappings,
+ QualifiedPathType qual_path_type,
+ LangItem::Kind lang_item,
+ location_t locus = UNDEF_LOCATION,
+ std::vector<AST::Attribute> outer_attrs
+ = std::vector<AST::Attribute> ());
+
location_t get_locus () const override final { return locus; }
void accept_vis (HIRFullVisitor &vis) override;
diff --git a/gcc/rust/hir/tree/rust-hir-stmt.cc b/gcc/rust/hir/tree/rust-hir-stmt.cc
index 025f67e..fd58e29 100644
--- a/gcc/rust/hir/tree/rust-hir-stmt.cc
+++ b/gcc/rust/hir/tree/rust-hir-stmt.cc
@@ -26,11 +26,13 @@ namespace HIR {
LetStmt::LetStmt (Analysis::NodeMapping mappings,
std::unique_ptr<Pattern> variables_pattern,
tl::optional<std::unique_ptr<Expr>> init_expr,
+ tl::optional<std::unique_ptr<Expr>> else_expr,
tl::optional<std::unique_ptr<Type>> type,
AST::AttrVec outer_attrs, location_t locus)
: Stmt (std::move (mappings)), outer_attrs (std::move (outer_attrs)),
variables_pattern (std::move (variables_pattern)), type (std::move (type)),
- init_expr (std::move (init_expr)), locus (locus)
+ init_expr (std::move (init_expr)), else_expr (std::move (else_expr)),
+ locus (locus)
{}
LetStmt::LetStmt (LetStmt const &other)
@@ -43,6 +45,8 @@ LetStmt::LetStmt (LetStmt const &other)
// guard to prevent null dereference (always required)
if (other.has_init_expr ())
init_expr = other.get_init_expr ().clone_expr ();
+ if (other.has_else_expr ())
+ else_expr = other.get_else_expr ().clone_expr ();
if (other.has_type ())
type = other.get_type ().clone_type ();
@@ -67,6 +71,12 @@ LetStmt::operator= (LetStmt const &other)
init_expr = other.get_init_expr ().clone_expr ();
else
init_expr = nullptr;
+
+ if (other.has_else_expr ())
+ else_expr = other.get_else_expr ().clone_expr ();
+ else
+ else_expr = tl::nullopt;
+
if (other.has_type ())
type = other.get_type ().clone_type ();
else
diff --git a/gcc/rust/hir/tree/rust-hir-stmt.h b/gcc/rust/hir/tree/rust-hir-stmt.h
index 3db1728..9c1a9ec 100644
--- a/gcc/rust/hir/tree/rust-hir-stmt.h
+++ b/gcc/rust/hir/tree/rust-hir-stmt.h
@@ -101,6 +101,7 @@ class LetStmt : public Stmt
tl::optional<std::unique_ptr<Type>> type;
tl::optional<std::unique_ptr<Expr>> init_expr;
+ tl::optional<std::unique_ptr<Expr>> else_expr;
location_t locus;
@@ -113,12 +114,15 @@ public:
// Returns whether let statement has an initialisation expression.
bool has_init_expr () const { return init_expr.has_value (); }
+ // Returns whether let statement has a diverging else expression.
+ bool has_else_expr () const { return else_expr.has_value (); }
std::string as_string () const override;
LetStmt (Analysis::NodeMapping mappings,
std::unique_ptr<Pattern> variables_pattern,
tl::optional<std::unique_ptr<Expr>> init_expr,
+ tl::optional<std::unique_ptr<Expr>> else_expr,
tl::optional<std::unique_ptr<Type>> type, AST::AttrVec outer_attrs,
location_t locus);
@@ -167,6 +171,18 @@ public:
return *init_expr.value ();
}
+ HIR::Expr &get_else_expr ()
+ {
+ rust_assert (*else_expr);
+ return *else_expr.value ();
+ }
+
+ const HIR::Expr &get_else_expr () const
+ {
+ rust_assert (*else_expr);
+ return *else_expr.value ();
+ }
+
HIR::Pattern &get_pattern () { return *variables_pattern; }
bool is_item () const override final { return false; }
diff --git a/gcc/rust/hir/tree/rust-hir-type.cc b/gcc/rust/hir/tree/rust-hir-type.cc
index 689d86b..ec48425 100644
--- a/gcc/rust/hir/tree/rust-hir-type.cc
+++ b/gcc/rust/hir/tree/rust-hir-type.cc
@@ -162,7 +162,7 @@ RawPointerType::operator= (RawPointerType const &other)
ReferenceType::ReferenceType (Analysis::NodeMapping mappings, Mutability mut,
std::unique_ptr<Type> type_no_bounds,
- location_t locus, Lifetime lifetime)
+ location_t locus, tl::optional<Lifetime> lifetime)
: TypeNoBounds (mappings, locus), lifetime (std::move (lifetime)), mut (mut),
type (std::move (type_no_bounds))
{}
@@ -268,7 +268,8 @@ BareFunctionType::BareFunctionType (BareFunctionType const &other)
for_lifetimes (other.for_lifetimes),
function_qualifiers (other.function_qualifiers), params (other.params),
is_variadic (other.is_variadic),
- return_type (other.return_type->clone_type ())
+ return_type (other.has_return_type () ? other.return_type->clone_type ()
+ : nullptr)
{}
BareFunctionType &
diff --git a/gcc/rust/hir/tree/rust-hir-type.h b/gcc/rust/hir/tree/rust-hir-type.h
index e231d78..cbc20ff 100644
--- a/gcc/rust/hir/tree/rust-hir-type.h
+++ b/gcc/rust/hir/tree/rust-hir-type.h
@@ -164,38 +164,6 @@ public:
void accept_vis (HIRTypeVisitor &vis) override;
};
-// Impl trait with a single bound? Poor reference material here.
-class ImplTraitTypeOneBound : public TypeNoBounds
-{
- TraitBound trait_bound;
-
-protected:
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- ImplTraitTypeOneBound *clone_type_impl () const override
- {
- return new ImplTraitTypeOneBound (*this);
- }
-
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- ImplTraitTypeOneBound *clone_type_no_bounds_impl () const override
- {
- return new ImplTraitTypeOneBound (*this);
- }
-
-public:
- ImplTraitTypeOneBound (Analysis::NodeMapping mappings, TraitBound trait_bound,
- location_t locus)
- : TypeNoBounds (mappings, locus), trait_bound (std::move (trait_bound))
- {}
-
- std::string as_string () const override;
- TraitBound &get_trait_bound () { return trait_bound; }
- void accept_vis (HIRFullVisitor &vis) override;
- void accept_vis (HIRTypeVisitor &vis) override;
-};
-
/* A type consisting of the "product" of others (the tuple's elements) in a
* specific order */
class TupleType : public TypeNoBounds
@@ -323,7 +291,7 @@ protected:
class ReferenceType : public TypeNoBounds
{
// bool has_lifetime; // TODO: handle in lifetime or something?
- Lifetime lifetime;
+ tl::optional<Lifetime> lifetime;
Mutability mut;
std::unique_ptr<Type> type;
@@ -333,12 +301,12 @@ public:
bool is_mut () const { return mut == Mutability::Mut; }
// Returns whether the reference has a lifetime.
- bool has_lifetime () const { return !lifetime.is_error (); }
+ bool has_lifetime () const { return lifetime.has_value (); }
// Constructor
ReferenceType (Analysis::NodeMapping mappings, Mutability mut,
std::unique_ptr<Type> type_no_bounds, location_t locus,
- Lifetime lifetime);
+ tl::optional<Lifetime> lifetime);
// Copy constructor with custom clone method
ReferenceType (ReferenceType const &other);
@@ -355,7 +323,8 @@ public:
void accept_vis (HIRFullVisitor &vis) override;
void accept_vis (HIRTypeVisitor &vis) override;
- Lifetime &get_lifetime () { return lifetime; }
+ Lifetime &get_lifetime () { return lifetime.value (); }
+ const Lifetime &get_lifetime () const { return lifetime.value (); }
Mutability get_mut () const { return mut; }
diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h b/gcc/rust/hir/tree/rust-hir-visitor.h
index 33e6b7b..283cc34 100644
--- a/gcc/rust/hir/tree/rust-hir-visitor.h
+++ b/gcc/rust/hir/tree/rust-hir-visitor.h
@@ -84,6 +84,7 @@ public:
virtual void visit (AwaitExpr &expr) = 0;
virtual void visit (AsyncBlockExpr &expr) = 0;
virtual void visit (InlineAsm &expr) = 0;
+ virtual void visit (LlvmInlineAsm &expr) = 0;
virtual void visit (TypeParam &param) = 0;
virtual void visit (ConstGenericParam &param) = 0;
virtual void visit (LifetimeWhereClauseItem &item) = 0;
@@ -142,7 +143,6 @@ public:
virtual void visit (ImplTraitType &type) = 0;
virtual void visit (TraitObjectType &type) = 0;
virtual void visit (ParenthesisedType &type) = 0;
- virtual void visit (ImplTraitTypeOneBound &type) = 0;
virtual void visit (TupleType &type) = 0;
virtual void visit (NeverType &type) = 0;
virtual void visit (RawPointerType &type) = 0;
@@ -221,6 +221,7 @@ public:
virtual void visit (AwaitExpr &) override {}
virtual void visit (AsyncBlockExpr &) override {}
virtual void visit (InlineAsm &) override {}
+ virtual void visit (LlvmInlineAsm &) override {}
virtual void visit (TypeParam &) override {}
virtual void visit (ConstGenericParam &) override {}
@@ -290,7 +291,6 @@ public:
virtual void visit (ImplTraitType &) override {}
virtual void visit (TraitObjectType &) override {}
virtual void visit (ParenthesisedType &) override {}
- virtual void visit (ImplTraitTypeOneBound &) override {}
virtual void visit (TupleType &) override {}
virtual void visit (NeverType &) override {}
virtual void visit (RawPointerType &) override {}
@@ -354,7 +354,6 @@ public:
virtual void visit (ImplTraitType &type) = 0;
virtual void visit (TraitObjectType &type) = 0;
virtual void visit (ParenthesisedType &type) = 0;
- virtual void visit (ImplTraitTypeOneBound &type) = 0;
virtual void visit (TupleType &type) = 0;
virtual void visit (NeverType &type) = 0;
virtual void visit (RawPointerType &type) = 0;
@@ -444,6 +443,7 @@ public:
virtual void visit (IfExpr &expr) = 0;
virtual void visit (IfExprConseqElse &expr) = 0;
virtual void visit (InlineAsm &expr) = 0;
+ virtual void visit (LlvmInlineAsm &expr) = 0;
virtual void visit (MatchExpr &expr) = 0;
virtual void visit (AwaitExpr &expr) = 0;
virtual void visit (AsyncBlockExpr &expr) = 0;
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index da1c8b9..093d8d5 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -19,6 +19,7 @@
#include "rust-ast-full.h"
#include "rust-hir-expr.h"
#include "rust-hir-full.h"
+#include "rust-hir-path.h"
#include "rust-hir-visitor.h"
#include "rust-diagnostics.h"
@@ -1210,6 +1211,9 @@ ClosureExpr::as_string () const
std::string
PathPattern::as_string () const
{
+ if (is_lang_item ())
+ return LangItem::PrettyString (*lang_item);
+
std::string str;
for (const auto &segment : segments)
@@ -1310,7 +1314,7 @@ ContinueExpr::as_string () const
if (has_label ())
{
- str += label.as_string ();
+ str += get_label ().as_string ();
}
return str;
@@ -1700,7 +1704,7 @@ WhileLoopExpr::as_string () const
}
else
{
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
}
str += "\n Conditional expr: " + condition->as_string ();
@@ -1722,7 +1726,7 @@ WhileLetLoopExpr::as_string () const
}
else
{
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
}
str += "\n Match arm patterns: ";
@@ -1757,7 +1761,7 @@ LoopExpr::as_string () const
}
else
{
- str += loop_label.as_string ();
+ str += get_loop_label ().as_string ();
}
str += "\n Loop block: " + loop_block->as_string ();
@@ -1812,7 +1816,7 @@ BreakExpr::as_string () const
if (has_label ())
{
- str += label.as_string () + " ";
+ str += get_label ().as_string () + " ";
}
if (has_break_expr ())
@@ -2097,11 +2101,6 @@ QualifiedPathInType::as_string () const
std::string
Lifetime::as_string () const
{
- if (is_error ())
- {
- return "error lifetime";
- }
-
switch (lifetime_type)
{
case AST::Lifetime::LifetimeType::NAMED:
@@ -2187,6 +2186,8 @@ TypeParam::as_string () const
AST::SimplePath
PathPattern::convert_to_simple_path (bool with_opening_scope_resolution) const
{
+ rust_assert (kind == Kind::Segmented);
+
if (!has_segments ())
{
return AST::SimplePath::create_empty ();
@@ -2754,7 +2755,7 @@ ReferenceType::as_string () const
if (has_lifetime ())
{
- str += lifetime.as_string () + " ";
+ str += get_lifetime ().as_string () + " ";
}
if (is_mut ())
@@ -2860,14 +2861,6 @@ BareFunctionType::as_string () const
}
std::string
-ImplTraitTypeOneBound::as_string () const
-{
- std::string str ("ImplTraitTypeOneBound: \n TraitBound: ");
-
- return str + trait_bound.as_string ();
-}
-
-std::string
TypePathSegmentGeneric::as_string () const
{
return TypePathSegment::as_string () + "<" + generic_args.as_string () + ">";
@@ -3413,7 +3406,7 @@ TraitFunctionDecl::as_string () const
str += "\n Function params: ";
if (is_method ())
{
- str += self.as_string () + (has_params () ? ", " : "");
+ str += get_self_unchecked ().as_string () + (has_params () ? ", " : "");
}
if (has_params ())
@@ -3527,70 +3520,63 @@ TraitItemType::as_string () const
std::string
SelfParam::as_string () const
{
- if (is_error ())
- {
- return "error";
- }
- else
+ if (has_type ())
{
- if (has_type ())
+ // type (i.e. not ref, no lifetime)
+ std::string str;
+
+ if (is_mut ())
{
- // type (i.e. not ref, no lifetime)
- std::string str;
+ str += "mut ";
+ }
- if (is_mut ())
- {
- str += "mut ";
- }
+ str += "self : ";
- str += "self : ";
+ str += type->as_string ();
- str += type->as_string ();
+ return str;
+ }
+ else if (has_lifetime ())
+ {
+ // ref and lifetime
+ std::string str = "&" + get_lifetime ().as_string () + " ";
- return str;
- }
- else if (has_lifetime ())
+ if (is_mut ())
{
- // ref and lifetime
- std::string str = "&" + lifetime.as_string () + " ";
+ str += "mut ";
+ }
- if (is_mut ())
- {
- str += "mut ";
- }
+ str += "self";
- str += "self";
+ return str;
+ }
+ else if (is_ref ())
+ {
+ // ref with no lifetime
+ std::string str = "&";
- return str;
- }
- else if (is_ref ())
+ if (is_mut ())
{
- // ref with no lifetime
- std::string str = "&";
+ str += " mut ";
+ }
- if (is_mut ())
- {
- str += " mut ";
- }
+ str += "self";
- str += "self";
+ return str;
+ }
+ else
+ {
+ // no ref, no type
+ std::string str;
- return str;
- }
- else
+ if (is_mut ())
{
- // no ref, no type
- std::string str;
-
- if (is_mut ())
- {
- str += "mut ";
- }
+ str += "mut ";
+ }
- str += "self";
+ str += "self";
- return str;
- }
+ return str;
}
}
@@ -3836,6 +3822,17 @@ InlineAsm::accept_vis (HIRFullVisitor &vis)
}
void
+LlvmInlineAsm::accept_vis (HIRFullVisitor &vis)
+{
+ vis.visit (*this);
+}
+void
+LlvmInlineAsm::accept_vis (HIRExpressionVisitor &vis)
+{
+ vis.visit (*this);
+}
+
+void
BorrowExpr::accept_vis (HIRExpressionVisitor &vis)
{
vis.visit (*this);
@@ -4520,12 +4517,6 @@ ParenthesisedType::accept_vis (HIRFullVisitor &vis)
}
void
-ImplTraitTypeOneBound::accept_vis (HIRFullVisitor &vis)
-{
- vis.visit (*this);
-}
-
-void
TupleType::accept_vis (HIRFullVisitor &vis)
{
vis.visit (*this);
@@ -4718,12 +4709,6 @@ ArrayType::accept_vis (HIRTypeVisitor &vis)
}
void
-ImplTraitTypeOneBound::accept_vis (HIRTypeVisitor &vis)
-{
- vis.visit (*this);
-}
-
-void
BareFunctionType::accept_vis (HIRTypeVisitor &vis)
{
vis.visit (*this);