diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-06-02 12:12:59 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-06-02 12:12:59 +0800 |
commit | 6f45483d70b7da92adec01ab67f5c7450c421801 (patch) | |
tree | 9ec323205f437f35d7453e6444c46f4782ba75ad /src/hir_conv/bind.cpp | |
parent | 6747de8643ffd4a0a1705ac4c00c8cfb9a957154 (diff) | |
download | mrust-6f45483d70b7da92adec01ab67f5c7450c421801.tar.gz |
Tweaks to handling of struct patterns
Diffstat (limited to 'src/hir_conv/bind.cpp')
-rw-r--r-- | src/hir_conv/bind.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/hir_conv/bind.cpp b/src/hir_conv/bind.cpp index c7a0829a..cf443eb6 100644 --- a/src/hir_conv/bind.cpp +++ b/src/hir_conv/bind.cpp @@ -248,37 +248,41 @@ namespace { (Struct, const auto& str = get_struct_ptr(sp, m_crate, e.path); if(str.m_data.is_Named() ) { - e.binding = &str; } else if( str.m_data.is_Unit() && e.sub_patterns.size() == 0 ) { - e.binding = &str; + } + else if( str.m_data.is_Tuple() && str.m_data.as_Tuple().empty() && e.sub_patterns.size() == 0 ) { } else { - ERROR(sp, E0000, "Struct pattern on field-less struct " << e.path); + ERROR(sp, E0000, "Struct pattern `" << pat << "` on field-less struct " << e.path); } + e.binding = &str; ), (EnumTuple, auto p = get_enum_ptr(sp, m_crate, e.path); const auto& var = p.first->m_variants[p.second].second; - TU_IFLET(::HIR::Enum::Variant, var, Tuple, _, - e.binding_ptr = p.first; - e.binding_idx = p.second; - ) + if( var.is_Tuple() ) { + } else { ERROR(sp, E0000, "Enum tuple pattern on non-tuple variant " << e.path); } + e.binding_ptr = p.first; + e.binding_idx = p.second; ), (EnumStruct, auto p = get_enum_ptr(sp, m_crate, e.path); const auto& var = p.first->m_variants[p.second].second; - TU_IFLET(::HIR::Enum::Variant, var, Struct, _, - // All good - e.binding_ptr = p.first; - e.binding_idx = p.second; - ) + if( var.is_Struct() ) { + } + else if( var.is_Unit() && e.sub_patterns.empty() ) { + } + else if( var.is_Tuple() && var.as_Tuple().empty() && e.sub_patterns.empty() ) { + } else { - ERROR(sp, E0000, "Enum tuple pattern on non-tuple variant " << e.path); + ERROR(sp, E0000, "Enum struct pattern `" << pat << "` on non-struct variant " << e.path); } + e.binding_ptr = p.first; + e.binding_idx = p.second; ) ) } |