diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-03-04 13:31:31 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-03-04 13:31:31 +0800 |
commit | 49c3799a2d6839add1ff4c3dd0526cf4b705784c (patch) | |
tree | 7402b51146c7fe220c5150e3978c8236edc303b1 | |
parent | b8910145acd02f09a0e30cda31125802ffefa01b (diff) | |
download | mrust-49c3799a2d6839add1ff4c3dd0526cf4b705784c.tar.gz |
HIR Expand Type Aliases - Handle default parameters
-rw-r--r-- | src/hir_conv/expand_type.cpp | 14 |
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 |