diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-03 10:32:08 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-03 10:34:43 +0800 |
commit | 56beb2239d8e8543c1775532cb8c50e488e083d0 (patch) | |
tree | 1a856600d9e4584186881479a74160605d483fc1 /src | |
parent | 57fe1cfc45965a9ed59d1371d62f9b39a7dab792 (diff) | |
download | mrust-56beb2239d8e8543c1775532cb8c50e488e083d0.tar.gz |
HIR Typecheck Expr - Allow borrow coercions when a downgrade reborrow happens
Diffstat (limited to 'src')
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp index 1522a420..7b360d55 100644 --- a/src/hir_typeck/expr_cs.cpp +++ b/src/hir_typeck/expr_cs.cpp @@ -4106,26 +4106,30 @@ namespace { (Borrow, TU_IFLET(::HIR::TypeRef::Data, ty_src.m_data, Borrow, r_e, // If using `&mut T` where `&const T` is expected - insert a reborrow (&*) + // TODO: &move reboorrowing rules? + //if( l_e.type < r_e.type ) { if( l_e.type == ::HIR::BorrowType::Shared && r_e.type == ::HIR::BorrowType::Unique ) { - context.equate_types(sp, *l_e.inner, *r_e.inner); // Add cast down auto span = node_ptr->span(); + // > Goes from `ty_src` -> `*ty_src` -> `&`l_e.type` `&ty_src` + const auto& inner_ty = *r_e.inner; + auto dst_bt = l_e.type; + auto new_type = ::HIR::TypeRef::new_borrow(dst_bt, inner_ty.clone()); // *<inner> - DEBUG("- Deref -> " << *l_e.inner); - node_ptr = NEWNODE( l_e.inner->clone(), span, _Deref, mv$(node_ptr) ); + DEBUG("- Deref -> " << inner_ty); + node_ptr = NEWNODE( inner_ty.clone(), span, _Deref, mv$(node_ptr) ); context.m_ivars.get_type(node_ptr->m_res_type); // &*<inner> - node_ptr = NEWNODE( ty_dst.clone(), span, _Borrow, ::HIR::BorrowType::Shared, mv$(node_ptr) ); + DEBUG("- Borrow -> " << new_type); + node_ptr = NEWNODE( mv$(new_type) , span, _Borrow, dst_bt, mv$(node_ptr) ); context.m_ivars.get_type(node_ptr->m_res_type); context.m_ivars.mark_change(); - return true; + + // Continue on with coercion (now that node_ptr is updated) } - // TODO: &move reboorrowing rules? - - if( l_e.type != r_e.type ) { - // TODO: This could be allowed if left == Shared && right == Unique (reborrowing) + else if( l_e.type != r_e.type ) { ERROR(sp, E0000, "Type mismatch between " << ty_dst << " and " << ty_src << " - Borrow classes differ"); } |