diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-12-16 13:08:09 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-16 13:08:09 +0000 |
commit | de1ed2e805cc7de7ab29b5e183354bae86173669 (patch) | |
tree | df2bc819e07affe08e13d8f09f8448c00ae4722a /gcc/rust/hir/rust-ast-lower-pattern.cc | |
parent | 8507a68883438060b3b8e828069ffe20a084b85a (diff) | |
parent | 4d70990b838e3fbeedaf0918c2c87f46cdf0d689 (diff) | |
download | gcc-de1ed2e805cc7de7ab29b5e183354bae86173669.zip gcc-de1ed2e805cc7de7ab29b5e183354bae86173669.tar.gz gcc-de1ed2e805cc7de7ab29b5e183354bae86173669.tar.bz2 |
Merge #838
838: Add mssing mappings to HIR::Pattern r=philberty a=philberty
These mappings are missing within the HIR but are required
to complete typechecking of all patterns in match arms. As the
fields of structures must bind their associated field's types to new
names declared as part of the pattern, these mappings give access
to the associated name-resolved NodeId's to figure this out.
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/hir/rust-ast-lower-pattern.cc')
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-pattern.cc | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc index 4ff61cd..156f023 100644 --- a/gcc/rust/hir/rust-ast-lower-pattern.cc +++ b/gcc/rust/hir/rust-ast-lower-pattern.cc @@ -61,8 +61,13 @@ ASTLoweringPattern::visit (AST::TupleStructPattern &pattern) break; } + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, pattern.get_node_id (), + mappings->get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + translated = new HIR::TupleStructPattern ( - *path, std::unique_ptr<HIR::TupleStructItems> (lowered)); + mapping, *path, std::unique_ptr<HIR::TupleStructItems> (lowered)); } void @@ -96,19 +101,38 @@ ASTLoweringPattern::visit (AST::StructPattern &pattern) AST::StructPatternFieldIdent &ident = static_cast<AST::StructPatternFieldIdent &> (*field.get ()); + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, ident.get_node_id (), + mappings->get_next_hir_id ( + crate_num), + UNKNOWN_LOCAL_DEFID); + f = new HIR::StructPatternFieldIdent ( - ident.get_identifier (), ident.is_ref (), + mapping, ident.get_identifier (), ident.is_ref (), ident.is_mut () ? Mutability::Mut : Mutability::Imm, ident.get_outer_attrs (), ident.get_locus ()); } break; } + // insert the reverse mappings and locations + auto crate_num = f->get_mappings ().get_crate_num (); + auto field_id = f->get_mappings ().get_hirid (); + auto field_node_id = f->get_mappings ().get_nodeid (); + mappings->insert_location (crate_num, field_id, f->get_locus ()); + mappings->insert_node_to_hir (crate_num, field_node_id, field_id); + + // add it to the lowered fields list fields.push_back (std::unique_ptr<HIR::StructPatternField> (f)); } + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, pattern.get_node_id (), + mappings->get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + HIR::StructPatternElements elems (std::move (fields)); - translated = new HIR::StructPattern (*path, std::move (elems)); + translated = new HIR::StructPattern (mapping, *path, std::move (elems)); } } // namespace HIR |