diff options
Diffstat (limited to 'gcc/rust/hir/rust-ast-lower-item.cc')
| -rw-r--r-- | gcc/rust/hir/rust-ast-lower-item.cc | 175 | 
1 files changed, 106 insertions, 69 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc index 4e5a747..81815ff 100644 --- a/gcc/rust/hir/rust-ast-lower-item.cc +++ b/gcc/rust/hir/rust-ast-lower-item.cc @@ -72,7 +72,7 @@ ASTLoweringItem::visit (AST::Module &module)        // The item may be null if it doesn't need to live in the HIR - for        // example, macro rules definitions        if (transitem) -	items.push_back (std::unique_ptr<Item> (transitem)); +	items.emplace_back (transitem);      }    // should be lowered/copied from module.get_in/outer_attrs() @@ -90,12 +90,11 @@ void  ASTLoweringItem::visit (AST::TypeAlias &alias)  {    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve (alias.get_where_clause ().get_items ().size ()); +    for (auto &item : alias.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ()));    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (alias.get_visibility ()); @@ -130,17 +129,19 @@ ASTLoweringItem::visit (AST::TupleStruct &struct_decl)      }    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    struct_decl.get_where_clause ().get_items ().size ()); +    for (auto &item : struct_decl.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ()));    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (struct_decl.get_visibility ());    std::vector<HIR::TupleField> fields; +  fields.reserve (struct_decl.get_fields ().size ()); +    for (AST::TupleField &field : struct_decl.get_fields ())      {        if (field.get_field_type ().is_marked_for_strip ()) @@ -155,11 +156,8 @@ ASTLoweringItem::visit (AST::TupleStruct &struct_decl)  				     mappings.get_next_hir_id (crate_num),  				     mappings.get_next_localdef_id (crate_num)); -      HIR::TupleField translated_field (mapping, -					std::unique_ptr<HIR::Type> (type), vis, -					field.get_locus (), -					field.get_outer_attrs ()); -      fields.push_back (std::move (translated_field)); +      fields.emplace_back (mapping, std::unique_ptr<HIR::Type> (type), vis, +			   field.get_locus (), field.get_outer_attrs ());      }    auto crate_num = mappings.get_current_crate (); @@ -185,12 +183,12 @@ ASTLoweringItem::visit (AST::StructStruct &struct_decl)      }    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    struct_decl.get_where_clause ().get_items ().size ()); +    for (auto &item : struct_decl.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ()));    HIR::WhereClause where_clause (std::move (where_clause_items)); @@ -245,25 +243,26 @@ ASTLoweringItem::visit (AST::Enum &enum_decl)      }    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    enum_decl.get_where_clause ().get_items ().size ()); +    for (auto &item : enum_decl.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ()));    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (enum_decl.get_visibility ());    // bool is_unit = enum_decl.is_zero_variant ();    std::vector<std::unique_ptr<HIR::EnumItem>> items; +  items.reserve (enum_decl.get_variants ().size ()); +    for (auto &variant : enum_decl.get_variants ())      {        if (variant->is_marked_for_strip ())  	continue; -      HIR::EnumItem *hir_item = ASTLoweringEnumItem::translate (variant.get ()); -      items.push_back (std::unique_ptr<HIR::EnumItem> (hir_item)); +      items.emplace_back (ASTLoweringEnumItem::translate (variant.get ()));      }    auto crate_num = mappings.get_current_crate (); @@ -288,17 +287,16 @@ ASTLoweringItem::visit (AST::Union &union_decl)  {    std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;    if (union_decl.has_generics ()) -    { -      generic_params = lower_generic_params (union_decl.get_generic_params ()); -    } +    generic_params = lower_generic_params (union_decl.get_generic_params ());    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    union_decl.get_where_clause ().get_items ().size ()); +    for (auto &item : union_decl.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ())); +    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (union_decl.get_visibility ()); @@ -390,12 +388,12 @@ ASTLoweringItem::visit (AST::Function &function)      return;    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    function.get_where_clause ().get_items ().size ()); +    for (auto &item : function.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ()));    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::FunctionQualifiers qualifiers @@ -418,10 +416,41 @@ ASTLoweringItem::visit (AST::Function &function)  				  : nullptr;    std::vector<HIR::FunctionParam> function_params; +  function_params.reserve (function.get_function_params ().size ()); + +  auto crate_num = mappings.get_current_crate ();    for (auto &p : function.get_function_params ())      { -      if (p->is_variadic () || p->is_self ()) +      if (p->is_variadic ())  	continue; +      if (p->is_self ()) +	{ +	  rich_location r (line_table, p->get_locus ()); +	  r.add_range (function.get_locus ()); +	  rust_error_at ( +	    r, "%<self%> parameter is only allowed in associated functions"); + +	  // rustc creates a synthetic regular fn-param here pointing to a +	  // generic Self as far as i can see but that seems over the top for +	  // now. +	  // +	  // see this example (invalid code): +	  // +	  // pub trait X { +	  //   fn x() { +	  //     fn f(&mut self) {} +	  //     f(); +	  //   } +	  // } +	  // +	  // without a synthetic param we wont get the number of args error as +	  // well but i think this is fine for now. +	  // +	  // problem is what we make the param type to become... + +	  continue; +	} +        auto param = static_cast<AST::FunctionParam &> (*p);        auto translated_pattern = std::unique_ptr<HIR::Pattern> ( @@ -434,10 +463,9 @@ ASTLoweringItem::visit (AST::Function &function)  				     mappings.get_next_hir_id (crate_num),  				     UNKNOWN_LOCAL_DEFID); -      auto hir_param -	= HIR::FunctionParam (mapping, std::move (translated_pattern), -			      std::move (translated_type), param.get_locus ()); -      function_params.push_back (std::move (hir_param)); +      function_params.emplace_back (mapping, std::move (translated_pattern), +				    std::move (translated_type), +				    param.get_locus ());      }    bool terminated = false; @@ -446,7 +474,6 @@ ASTLoweringItem::visit (AST::Function &function)        ASTLoweringBlock::translate (*function.get_definition ().value (),  				   &terminated)); -  auto crate_num = mappings.get_current_crate ();    Analysis::NodeMapping mapping (crate_num, function.get_node_id (),  				 mappings.get_next_hir_id (crate_num),  				 mappings.get_next_localdef_id (crate_num)); @@ -479,11 +506,12 @@ void  ASTLoweringItem::visit (AST::InherentImpl &impl_block)  {    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    impl_block.get_where_clause ().get_items ().size ()); +    for (auto &item : impl_block.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i = ASTLowerWhereClauseItem::translate (*item); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item));    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (impl_block.get_visibility ()); @@ -540,7 +568,7 @@ ASTLoweringItem::visit (AST::InherentImpl &impl_block)        HIR::ImplItem *lowered  	= ASTLowerImplItem::translate (*impl_item, mapping.get_hirid ());        rust_assert (lowered != nullptr); -      impl_items.push_back (std::unique_ptr<HIR::ImplItem> (lowered)); +      impl_items.emplace_back (lowered);        impl_item_ids.push_back (lowered->get_impl_mappings ().get_hirid ());      } @@ -563,12 +591,12 @@ void  ASTLoweringItem::visit (AST::Trait &trait)  {    std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve (trait.get_where_clause ().get_items ().size ()); +    for (auto &item : trait.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i -	= ASTLowerWhereClauseItem::translate (*item.get ()); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item.get ())); +    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (trait.get_visibility ()); @@ -589,23 +617,24 @@ ASTLoweringItem::visit (AST::Trait &trait)    if (trait.has_type_param_bounds ())      {        for (auto &bound : trait.get_type_param_bounds ()) -	{ -	  HIR::TypeParamBound *b = lower_bound (*bound); -	  type_param_bounds.push_back ( -	    std::unique_ptr<HIR::TypeParamBound> (b)); -	} +	type_param_bounds.emplace_back (lower_bound (*bound));      } +  auto trait_item_size = trait.get_trait_items ().size (); +    std::vector<std::unique_ptr<HIR::TraitItem>> trait_items; +  trait_items.reserve (trait_item_size);    std::vector<HirId> trait_item_ids; +  trait_item_ids.reserve (trait_item_size); +    for (auto &item : trait.get_trait_items ())      {        if (item->is_marked_for_strip ())  	continue;        HIR::TraitItem *lowered = ASTLowerTraitItem::translate (*item); -      trait_items.push_back (std::unique_ptr<HIR::TraitItem> (lowered));        trait_item_ids.push_back (lowered->get_mappings ().get_hirid ()); +      trait_items.emplace_back (lowered);      }    auto crate_num = mappings.get_current_crate (); @@ -636,13 +665,16 @@ ASTLoweringItem::visit (AST::Trait &trait)  void  ASTLoweringItem::visit (AST::TraitImpl &impl_block)  { -  std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;    bool unsafe = impl_block.is_unsafe (); + +  std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items; +  where_clause_items.reserve ( +    impl_block.get_where_clause ().get_items ().size ()); +    for (auto &item : impl_block.get_where_clause ().get_items ()) -    { -      HIR::WhereClauseItem *i = ASTLowerWhereClauseItem::translate (*item); -      where_clause_items.push_back (std::unique_ptr<HIR::WhereClauseItem> (i)); -    } +    where_clause_items.emplace_back ( +      ASTLowerWhereClauseItem::translate (*item)); +    HIR::WhereClause where_clause (std::move (where_clause_items));    HIR::Visibility vis = translate_visibility (impl_block.get_visibility ()); @@ -690,8 +722,13 @@ ASTLoweringItem::visit (AST::TraitImpl &impl_block)  				 mappings.get_next_hir_id (crate_num),  				 mappings.get_next_localdef_id (crate_num)); +  auto impl_items_size = impl_block.get_impl_items ().size (); +    std::vector<std::unique_ptr<HIR::ImplItem>> impl_items; +  impl_items.reserve (impl_items_size);    std::vector<HirId> impl_item_ids; +  impl_item_ids.reserve (impl_items_size); +    for (auto &impl_item : impl_block.get_impl_items ())      {        if (impl_item->is_marked_for_strip ()) @@ -700,8 +737,8 @@ ASTLoweringItem::visit (AST::TraitImpl &impl_block)        HIR::ImplItem *lowered  	= ASTLowerImplItem::translate (*impl_item, mapping.get_hirid ());        rust_assert (lowered != nullptr); -      impl_items.push_back (std::unique_ptr<HIR::ImplItem> (lowered));        impl_item_ids.push_back (lowered->get_impl_mappings ().get_hirid ()); +      impl_items.emplace_back (lowered);      }    BoundPolarity polarity = impl_block.is_exclam ()  | 
