summaryrefslogtreecommitdiff
path: root/src/hir_typeck
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-06-02 12:12:59 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-06-02 12:12:59 +0800
commit6f45483d70b7da92adec01ab67f5c7450c421801 (patch)
tree9ec323205f437f35d7453e6444c46f4782ba75ad /src/hir_typeck
parent6747de8643ffd4a0a1705ac4c00c8cfb9a957154 (diff)
downloadmrust-6f45483d70b7da92adec01ab67f5c7450c421801.tar.gz
Tweaks to handling of struct patterns
Diffstat (limited to 'src/hir_typeck')
-rw-r--r--src/hir_typeck/expr_cs.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 5597b022..fb56abc4 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -1157,6 +1157,12 @@ namespace {
const auto& enm = *e;
auto it = ::std::find_if(enm.m_variants.begin(), enm.m_variants.end(), [&](const auto&v)->auto{ return v.first == var_name; });
assert(it != enm.m_variants.end());
+ if( it->second.is_Unit() || it->second.is_Value() || it->second.is_Tuple() ) {
+ ASSERT_BUG(node.span(), node.m_values.size() == 0, "Values provided for unit-like variant");
+ ASSERT_BUG(node.span(), ! node.m_base_value, "Values provided for unit-like variant");
+ return ;
+ }
+ ASSERT_BUG(node.span(), it->second.is_Struct(), "_StructLiteral for non-struct variant - " << node.m_path);
fields_ptr = &it->second.as_Struct();
generics = &enm.m_params;
),
@@ -1164,10 +1170,14 @@ namespace {
TODO(node.span(), "StructLiteral of a union - " << ty);
),
(Struct,
- if( e->m_data.is_Unit() )
+ if( e->m_data.is_Unit() || e->m_data.is_Tuple() )
{
ASSERT_BUG(node.span(), node.m_values.size() == 0, "Values provided for unit-like struct");
- ASSERT_BUG(node.span(), ! node.m_base_value, "Values provided for unit-like struct");
+
+ if( node.m_base_value ) {
+ auto _ = this->push_inner_coerce_scoped(false);
+ node.m_base_value->visit( *this );
+ }
return ;
}
@@ -3817,10 +3827,14 @@ void Context::add_binding(const Span& sp, ::HIR::Pattern& pat, const ::HIR::Type
this->add_ivars_params( e.path.m_params );
this->equate_types( sp, type, ::HIR::TypeRef::new_path(e.path.clone(), ::HIR::TypeRef::TypePathBinding(e.binding)) );
+ if( e.sub_patterns.empty() )
+ return ;
+
assert(e.binding);
const auto& str = *e.binding;
+
// - assert check from earlier pass
- assert( str.m_data.is_Named() );
+ ASSERT_BUG(sp, str.m_data.is_Named(), "Struct pattern on non-Named struct");
const auto& sd = str.m_data.as_Named();
const auto& params = e.path.m_params;
@@ -3893,6 +3907,9 @@ void Context::add_binding(const Span& sp, ::HIR::Pattern& pat, const ::HIR::Type
this->equate_types( sp, type, ::HIR::TypeRef::new_path(mv$(path), ::HIR::TypeRef::TypePathBinding(e.binding_ptr)) );
}
+ if( e.sub_patterns.empty() )
+ return ;
+
assert(e.binding_ptr);
const auto& enm = *e.binding_ptr;
const auto& var = enm.m_variants[e.binding_idx].second;