summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hir_typeck/expr_cs.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 4a5171f5..a9e6e9ad 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -3690,9 +3690,10 @@ void Context::handle_pattern(const Span& sp, ::HIR::Pattern& pat, const ::HIR::T
struct H2 {
static bool has_ref_or_borrow(const Span& sp, const ::HIR::Pattern& pat) {
- if( pat.m_binding.is_valid() && pat.m_binding.m_type != ::HIR::PatternBinding::Type::Move ) {
- return true;
- }
+ // TODO: Turns out that this isn't valid. See libsyntax 1.29
+ //if( pat.m_binding.is_valid() && pat.m_binding.m_type != ::HIR::PatternBinding::Type::Move ) {
+ // return true;
+ //}
if( pat.m_data.is_Ref() ) {
return true;
}
@@ -3821,8 +3822,11 @@ void Context::handle_pattern(const Span& sp, ::HIR::Pattern& pat, const ::HIR::T
if( pattern.m_binding.is_valid() )
{
// - Binding present, use the current binding mode
- pattern.m_binding.m_type = binding_mode;
- switch(binding_mode)
+ if( pattern.m_binding.m_type == ::HIR::PatternBinding::Type::Move )
+ {
+ pattern.m_binding.m_type = binding_mode;
+ }
+ switch(pattern.m_binding.m_type)
{
case ::HIR::PatternBinding::Type::Move:
context.equate_types(sp, context.get_var(sp, pattern.m_binding.m_slot), type);
@@ -4006,7 +4010,18 @@ void Context::handle_pattern(const Span& sp, ::HIR::Pattern& pat, const ::HIR::T
rv &= this->revisit_inner(context, e.sub_patterns[i], te[i], binding_mode);
}
TU_ARM(pattern.m_data, SplitTuple, pe) {
- TODO(sp, "Match ergonomics - split-tuple pattern");
+ if( !ty.m_data.is_Tuple() ) {
+ ERROR(sp, E0000, "Matching a non-tuple with a tuple pattern - " << ty);
+ }
+ const auto& te = ty.m_data.as_Tuple();
+ if( pe.leading.size() + pe.trailing.size() > te.size() ) {
+ ERROR(sp, E0000, "Split-tuple pattern with an incorrect number of fields, expected at most " << (pe.leading.size() + pe.trailing.size()) << "-tuple, got " << ty);
+ }
+ rv = true;
+ for(size_t i = 0; i < pe.leading.size(); i++)
+ rv &= this->revisit_inner(context, pe.leading[i], te[i], binding_mode);
+ for(size_t i = 0; i < pe.trailing.size(); i++)
+ rv &= this->revisit_inner(context, pe.trailing[i], te[te.size() - pe.trailing.size() + i], binding_mode);
}
TU_ARM(pattern.m_data, Slice, e) {
const ::HIR::TypeRef* slice_inner;