summaryrefslogtreecommitdiff
path: root/src/convert/ast_iterate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/convert/ast_iterate.cpp')
-rw-r--r--src/convert/ast_iterate.cpp25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/convert/ast_iterate.cpp b/src/convert/ast_iterate.cpp
index 72cfd009..10eaf80b 100644
--- a/src/convert/ast_iterate.cpp
+++ b/src/convert/ast_iterate.cpp
@@ -178,25 +178,26 @@ void CASTIterator::handle_pattern(AST::Pattern& pat, const TypeRef& type_hint)
const auto& hint_binding = hint_path.binding();
const auto& pat_binding = pat_path.binding();
DEBUG("Pat: " << pat_path << ", Type: " << type_hint.path());
- switch( hint_binding.type() )
- {
- case AST::PathBinding::UNBOUND:
+ TU_MATCH_DEF( AST::PathBinding, (hint_binding), (info),
+ (
+ throw ::std::runtime_error(FMT("Bad type in tuple struct pattern : " << type_hint.path()))
+ ),
+ (Unbound,
throw ::std::runtime_error("Unbound path in pattern");
- case AST::PathBinding::ENUM: {
+ ),
+ (Enum,
// The pattern's path must refer to a variant of the hint path
// - Actual type params are checked by the 'handle_pattern_enum' code
- if( pat_binding.type() != AST::PathBinding::ENUM_VAR )
+ if( !pat_binding.is_EnumVar() )
throw ::std::runtime_error(FMT("Paths in pattern are invalid"));
- if( pat_binding.bound_enumvar().enum_ != &hint_binding.bound_enum() )
+ if( pat_binding.as_EnumVar().enum_ != info.enum_ )
throw ::std::runtime_error(FMT("Paths in pattern are invalid"));
- const auto& enm = *pat_binding.bound_enumvar().enum_;
- auto idx = pat_binding.bound_enumvar().idx;
+ const auto& enm = *pat_binding.as_EnumVar().enum_;
+ auto idx = pat_binding.as_EnumVar().idx;
auto& var = enm.variants().at(idx);
handle_pattern_enum(pat_path[-2].args(), hint_path[-1].args(), enm.params(), var, v.sub_patterns);
- break; }
- default:
- throw ::std::runtime_error(FMT("Bad type in tuple struct pattern : " << type_hint.path()));
- }
+ )
+ )
}
break; }
}