summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-03-04 13:31:31 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-03-04 13:31:31 +0800
commit49c3799a2d6839add1ff4c3dd0526cf4b705784c (patch)
tree7402b51146c7fe220c5150e3978c8236edc303b1
parentb8910145acd02f09a0e30cda31125802ffefa01b (diff)
downloadmrust-49c3799a2d6839add1ff4c3dd0526cf4b705784c.tar.gz
HIR Expand Type Aliases - Handle default parameters
-rw-r--r--src/hir_conv/expand_type.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/hir_conv/expand_type.cpp b/src/hir_conv/expand_type.cpp
index 6b06a748..2dfffb73 100644
--- a/src/hir_conv/expand_type.cpp
+++ b/src/hir_conv/expand_type.cpp
@@ -21,8 +21,14 @@
// Anything else - leave it be
),
(TypeAlias,
- if( !is_expr && path.m_params.m_types.size() != e2.m_params.m_types.size() ) {
- ERROR(sp, E0000, "Mismatched parameter count in " << path << ", expected " << e2.m_params.m_types.size() << " got " << path.m_params.m_types.size());
+ auto pp = path.m_params.clone();
+ if( !is_expr ) {
+ while( pp.m_types.size() < e2.m_params.m_types.size() && e2.m_params.m_types[pp.m_types.size()].m_default != ::HIR::TypeRef() ) {
+ pp.m_types.push_back( e2.m_params.m_types[pp.m_types.size()].m_default.clone() );
+ }
+ if( pp.m_types.size() != e2.m_params.m_types.size() ) {
+ ERROR(sp, E0000, "Mismatched parameter count in " << path << ", expected " << e2.m_params.m_types.size() << " got " << pp.m_types.size());
+ }
}
if( e2.m_params.m_types.size() > 0 ) {
// TODO: Better `monomorphise_type`
@@ -33,8 +39,8 @@
}
else if( (ge.binding >> 8) == 0 ) {
auto idx = ge.binding & 0xFF;
- if( idx < path.m_params.m_types.size() )
- return path.m_params.m_types[idx];
+ if( idx < pp.m_types.size() )
+ return pp.m_types[idx];
else if( is_expr )
return empty_type;
else