diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-03-02 09:32:27 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-03-02 09:32:27 +0800 |
commit | 0bf33b8dc69b4f73d0207e277498858486057c29 (patch) | |
tree | 5825e640b3318484b1a7c2085b698b9f7156dab6 /src | |
parent | f955d04099a70bca8fe238a77c8c328150ff028c (diff) | |
download | mrust-0bf33b8dc69b4f73d0207e277498858486057c29.tar.gz |
HIR - Clone deref count when cloning pattern
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/pattern.cpp | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/src/hir/pattern.cpp b/src/hir/pattern.cpp index a86dbfa7..d25b25e7 100644 --- a/src/hir/pattern.cpp +++ b/src/hir/pattern.cpp @@ -184,102 +184,108 @@ namespace { } } // namespace -::HIR::Pattern HIR::Pattern::clone() const +namespace { ::HIR::Pattern::Data clone_pattern_data(const ::HIR::Pattern::Data& m_data) { TU_MATCH(::HIR::Pattern::Data, (m_data), (e), (Any, - return Pattern(m_binding, Data::make_Any({})); + return ::HIR::Pattern::Data::make_Any({}); ), (Box, - return Pattern(m_binding, Data::make_Box({ + return ::HIR::Pattern::Data::make_Box({ box$( e.sub->clone() ) - })); + }); ), (Ref, - return Pattern(m_binding, Data::make_Ref({ + return ::HIR::Pattern::Data::make_Ref({ e.type, box$(e.sub->clone()) - })); + }); ), (Tuple, - return Pattern(m_binding, Data::make_Tuple({ + return ::HIR::Pattern::Data::make_Tuple({ clone_pat_vec(e.sub_patterns) - })); + }); ), (SplitTuple, - return Pattern(m_binding, Data::make_SplitTuple({ + return ::HIR::Pattern::Data::make_SplitTuple({ clone_pat_vec(e.leading), clone_pat_vec(e.trailing), e.total_size - })); + }); ), (StructValue, - return Pattern(m_binding, Data::make_StructValue({ + return ::HIR::Pattern::Data::make_StructValue({ e.path.clone(), e.binding - })); + }); ), (StructTuple, - return Pattern(m_binding, Data::make_StructTuple({ + return ::HIR::Pattern::Data::make_StructTuple({ e.path.clone(), e.binding, clone_pat_vec(e.sub_patterns) - })); + }); ), (Struct, - return Pattern(m_binding, Data::make_Struct({ + return ::HIR::Pattern::Data::make_Struct({ e.path.clone(), e.binding, clone_pat_fields(e.sub_patterns), e.is_exhaustive - })); + }); ), (Value, - return Pattern(m_binding, Data::make_Value({ + return ::HIR::Pattern::Data::make_Value({ clone_patval(e.val) - })); + }); ), (Range, - return Pattern(m_binding, Data::make_Range({ + return ::HIR::Pattern::Data::make_Range({ clone_patval(e.start), clone_patval(e.end) - })); + }); ), (EnumValue, - return Pattern(m_binding, Data::make_EnumValue({ e.path.clone(), e.binding_ptr, e.binding_idx })); + return ::HIR::Pattern::Data::make_EnumValue({ e.path.clone(), e.binding_ptr, e.binding_idx }); ), (EnumTuple, - return Pattern(m_binding, Data::make_EnumTuple({ + return ::HIR::Pattern::Data::make_EnumTuple({ e.path.clone(), e.binding_ptr, e.binding_idx, clone_pat_vec(e.sub_patterns) - })); + }); ), (EnumStruct, - return Pattern(m_binding, Data::make_EnumStruct({ + return ::HIR::Pattern::Data::make_EnumStruct({ e.path.clone(), e.binding_ptr, e.binding_idx, clone_pat_fields(e.sub_patterns), e.is_exhaustive - })); + }); ), (Slice, - return Pattern(m_binding, Data::make_Slice({ + return ::HIR::Pattern::Data::make_Slice({ clone_pat_vec(e.sub_patterns) - })); + }); ), (SplitSlice, - return Pattern(m_binding, Data::make_SplitSlice({ + return ::HIR::Pattern::Data::make_SplitSlice({ clone_pat_vec(e.leading), e.extra_bind, clone_pat_vec(e.trailing) - })); + }); ) ) throw ""; +} } +::HIR::Pattern HIR::Pattern::clone() const +{ + auto rv = Pattern(m_binding, clone_pattern_data(m_data)); + rv.m_implicit_deref_count = m_implicit_deref_count; + return rv; } |