summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-28 23:59:56 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-28 23:59:56 +0800
commit6be8db3efc9a9156e262a03c8d6b13d32e3b1c39 (patch)
treead47b6da74e4af94db142fdc62d47480731d0469 /src
parent09431cd6ff866647341671d0a2ed2ebd7b85feb3 (diff)
downloadmrust-6be8db3efc9a9156e262a03c8d6b13d32e3b1c39.tar.gz
HIR Expand Type Aliases - Allow missing params in expression context
Diffstat (limited to 'src')
-rw-r--r--src/hir_conv/expand_type.cpp32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/hir_conv/expand_type.cpp b/src/hir_conv/expand_type.cpp
index f2565954..fed3ee24 100644
--- a/src/hir_conv/expand_type.cpp
+++ b/src/hir_conv/expand_type.cpp
@@ -7,16 +7,18 @@
#include <hir/visitor.hpp>
#include <hir_typeck/common.hpp> // monomorphise_type_with
-::HIR::TypeRef ConvertHIR_ExpandAliases_GetExpansion_GP(const Span& sp, const ::HIR::Crate& crate, const ::HIR::GenericPath& path)
+::HIR::TypeRef ConvertHIR_ExpandAliases_GetExpansion_GP(const Span& sp, const ::HIR::Crate& crate, const ::HIR::GenericPath& path, bool is_expr)
{
+ ::HIR::TypeRef empty_type;
+
const auto& ti = crate.get_typeitem_by_path(sp, path.m_path);
TU_MATCH_DEF( ::HIR::TypeItem, (ti), (e2),
(
// Anything else - leave it be
),
(TypeAlias,
- if( path.m_params.m_types.size() != e2.m_params.m_types.size() ) {
- ERROR(sp, E0000, "Mismatched parameter count in " << path);
+ 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());
}
if( e2.m_params.m_types.size() > 0 ) {
// TODO: Better `monomorphise_type`
@@ -27,8 +29,12 @@
}
else if( (ge.binding >> 8) == 0 ) {
auto idx = ge.binding & 0xFF;
- ASSERT_BUG(sp, idx < path.m_params.m_types.size(), "");
- return path.m_params.m_types[idx];
+ if( idx < path.m_params.m_types.size() )
+ return path.m_params.m_types[idx];
+ else if( is_expr )
+ return empty_type;
+ else
+ BUG(sp, "Referenced parameter missing from input");
}
else {
BUG(sp, "Bad index " << ge.binding << " encountered in expansion for " << path << " - " << e2.m_type);
@@ -43,12 +49,12 @@
return ::HIR::TypeRef();
}
-::HIR::TypeRef ConvertHIR_ExpandAliases_GetExpansion(const ::HIR::Crate& crate, const ::HIR::Path& path)
+::HIR::TypeRef ConvertHIR_ExpandAliases_GetExpansion(const ::HIR::Crate& crate, const ::HIR::Path& path, bool is_expr)
{
static Span sp;
TU_MATCH(::HIR::Path::Data, (path.m_data), (e),
(Generic,
- return ConvertHIR_ExpandAliases_GetExpansion_GP(sp, crate, e);
+ return ConvertHIR_ExpandAliases_GetExpansion_GP(sp, crate, e, is_expr);
),
(UfcsInherent,
DEBUG("TODO: Locate impl blocks for types - path=" << path);
@@ -67,6 +73,7 @@ class Expander:
public ::HIR::Visitor
{
const ::HIR::Crate& m_crate;
+ bool m_in_expr = false;
public:
Expander(const ::HIR::Crate& crate):
@@ -78,7 +85,7 @@ public:
::HIR::Visitor::visit_type(ty);
TU_IFLET(::HIR::TypeRef::Data, (ty.m_data), Path, (e),
- ::HIR::TypeRef new_type = ConvertHIR_ExpandAliases_GetExpansion(m_crate, e.path);
+ ::HIR::TypeRef new_type = ConvertHIR_ExpandAliases_GetExpansion(m_crate, e.path, m_in_expr);
// Keep trying to expand down the chain
unsigned int num_exp = 1;
const unsigned int MAX_RECURSIVE_TYPE_EXPANSIONS = 100;
@@ -86,7 +93,7 @@ public:
{
TU_IFLET(::HIR::TypeRef::Data, (new_type.m_data), Path, (e),
::HIR::Visitor::visit_type(new_type);
- auto nt = ConvertHIR_ExpandAliases_GetExpansion(m_crate, e.path);
+ auto nt = ConvertHIR_ExpandAliases_GetExpansion(m_crate, e.path, m_in_expr);
if( nt == ::HIR::TypeRef() )
break;
num_exp ++;
@@ -114,7 +121,7 @@ public:
unsigned int num_exp = 0;
do {
- auto ty = ConvertHIR_ExpandAliases_GetExpansion_GP(sp, m_crate, *cur);
+ auto ty = ConvertHIR_ExpandAliases_GetExpansion_GP(sp, m_crate, *cur, m_in_expr);
if( ty == ::HIR::TypeRef() )
break ;
if( !ty.m_data.is_Path() )
@@ -239,8 +246,13 @@ public:
if( expr.get() != nullptr )
{
+ auto old = m_in_expr;
+ m_in_expr = true;
+
Visitor v { *this };
(*expr).visit(v);
+
+ m_in_expr = old;
}
}
};