summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-21 08:40:52 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-21 08:40:52 +0800
commit86d060a7d6eae3a7ab3df5cb3405e368144be99e (patch)
treeee85505563d723b7c91f2fb12f3cef5519f1efd8
parent2d3f40522064bfef4765cc093a58e675db849c7c (diff)
downloadmrust-86d060a7d6eae3a7ab3df5cb3405e368144be99e.tar.gz
HIR+Resolve - Fix minor holes
-rw-r--r--src/hir/from_ast.cpp64
-rw-r--r--src/hir/from_ast.hpp4
-rw-r--r--src/hir/from_ast_expr.cpp9
-rw-r--r--src/hir/hir.hpp1
-rw-r--r--src/resolve/absolute.cpp4
5 files changed, 53 insertions, 29 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 177bc65c..a6947f8f 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -70,13 +70,13 @@
(IsTrait,
rv.m_bounds.push_back(::HIR::GenericBound::make_TraitBound({
LowerHIR_Type(e.type),
- ::HIR::TraitPath { LowerHIR_GenericPath(e.trait), e.hrls }
+ ::HIR::TraitPath { LowerHIR_GenericPath(Span(), e.trait), e.hrls }
}));
),
(MaybeTrait,
rv.m_bounds.push_back(::HIR::GenericBound::make_TraitUnbound({
LowerHIR_Type(e.type),
- LowerHIR_GenericPath(e.trait)
+ LowerHIR_GenericPath(Span(), e.trait)
}));
),
(NotTrait,
@@ -167,7 +167,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_EnumTuple({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -176,7 +176,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_StructTuple({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -197,7 +197,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_EnumStruct({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -206,7 +206,7 @@
return ::HIR::Pattern {
mv$(binding),
::HIR::Pattern::Data::make_Struct({
- LowerHIR_GenericPath(e.path),
+ LowerHIR_GenericPath(Span(), e.path),
mv$(sub_patterns)
})
};
@@ -251,7 +251,7 @@
return ::HIR::Pattern::Value::make_String(e);
),
(Named,
- return ::HIR::Pattern::Value::make_Named( LowerHIR_Path(e) );
+ return ::HIR::Pattern::Value::make_Named( LowerHIR_Path(Span(), e) );
)
)
throw "BUGCHECK: Reached end of LowerHIR_Pattern::H::lowerhir_pattern_value";
@@ -356,7 +356,7 @@
throw "BUG: Encountered non-Absolute path when creating ::HIR::GenericPath";
}
}
-::HIR::GenericPath LowerHIR_GenericPath(const ::AST::Path& path)
+::HIR::GenericPath LowerHIR_GenericPath(const Span& sp, const ::AST::Path& path)
{
TU_IFLET(::AST::Path::Class, path.m_class, Absolute, e,
auto sp = LowerHIR_SimplePath(path, true);
@@ -370,30 +370,30 @@
BUG(Span(), "Encountered non-Absolute path when creating ::HIR::GenericPath - " << path);
}
}
-::HIR::Path LowerHIR_Path(const ::AST::Path& path)
+::HIR::Path LowerHIR_Path(const Span& sp, const ::AST::Path& path)
{
TU_MATCH(::AST::Path::Class, (path.m_class), (e),
(Invalid,
- throw "BUG: Encountered Invalid path in LowerHIR_Path";
+ BUG(sp, "BUG: Encountered Invalid path in LowerHIR_Path");
),
(Local,
- BUG(Span(), "TODO: What to do wth Path::Class::Local in LowerHIR_Path - " << path);
+ TODO(sp, "What to do wth Path::Class::Local in LowerHIR_Path - " << path);
),
(Relative,
- throw "BUG: Encountered `Relative` path in LowerHIR_Path";
+ BUG(sp, "Encountered `Relative` path in LowerHIR_Path - " << path);
),
(Self,
- throw "BUG: Encountered `Self` path in LowerHIR_Path";
+ BUG(sp, "Encountered `Self` path in LowerHIR_Path - " << path);
),
(Super,
- throw "BUG: Encountered `Super` path in LowerHIR_Path";
+ BUG(sp, "Encountered `Super` path in LowerHIR_Path - " << path);
),
(Absolute,
- return ::HIR::Path( LowerHIR_GenericPath(path) );
+ return ::HIR::Path( LowerHIR_GenericPath(sp, path) );
),
(UFCS,
if( e.nodes.size() != 1 )
- throw "TODO: Handle UFCS with multiple nodes";
+ TODO(Span(), "Handle UFCS with multiple nodes - " << path);
if( ! e.trait )
{
return ::HIR::Path(::HIR::Path::Data::make_UfcsInherent({
@@ -414,7 +414,7 @@
{
return ::HIR::Path(
LowerHIR_Type(*e.type),
- LowerHIR_GenericPath(*e.trait),
+ LowerHIR_GenericPath(sp, *e.trait),
e.nodes[0].name(),
{}
);
@@ -501,7 +501,7 @@
return ::HIR::TypeRef( l.name, slot );
)
else {
- return ::HIR::TypeRef( LowerHIR_Path(e.path) );
+ return ::HIR::TypeRef( LowerHIR_Path(ty.span(), e.path) );
}
),
(TraitObject,
@@ -510,14 +510,21 @@
::HIR::TypeRef::Data::Data_TraitObject v;
for(const auto& t : e.traits)
{
- v.m_traits.push_back( LowerHIR_GenericPath(t) );
+ v.m_traits.push_back( LowerHIR_GenericPath(ty.span(), t) );
}
return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_TraitObject( mv$(v) ) );
),
(Function,
- TODO(ty.span(), "Function types");
- //::HIR::FunctionType f;
- //return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function( mv$(f) ) );
+ ::std::vector< ::HIR::TypeRef> args;
+ for(const auto& arg : e.info.m_arg_types)
+ args.push_back( LowerHIR_Type(arg) );
+ ::HIR::FunctionType f {
+ e.info.is_unsafe,
+ e.info.m_abi,
+ box$( LowerHIR_Type(*e.info.m_rettype) ),
+ mv$(args)
+ };
+ return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function( mv$(f) ) );
),
(Generic,
return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Generic({ e.name, 0 }) );
@@ -607,11 +614,20 @@
}
::HIR::Trait LowerHIR_Trait(const ::AST::Trait& f)
{
+ ::std::string lifetime;
+
::std::vector< ::HIR::GenericPath> supertraits;
- for(const auto& st : f.supertraits())
- supertraits.push_back( LowerHIR_GenericPath(st) );
+ for(const auto& st : f.supertraits()) {
+ if( st.is_valid() ) {
+ supertraits.push_back( LowerHIR_GenericPath(Span(), st) );
+ }
+ else {
+ lifetime = "static";
+ }
+ }
::HIR::Trait rv {
LowerHIR_GenericParams(f.params()),
+ mv$(lifetime),
mv$(supertraits),
{},
{}
diff --git a/src/hir/from_ast.hpp b/src/hir/from_ast.hpp
index ef55d3a5..0822c835 100644
--- a/src/hir/from_ast.hpp
+++ b/src/hir/from_ast.hpp
@@ -3,8 +3,8 @@
#include <hir/expr_ptr.hpp>
extern ::HIR::ExprPtr LowerHIR_ExprNode(const ::AST::ExprNode& e);
-extern ::HIR::Path LowerHIR_Path(const ::AST::Path& path);
-extern ::HIR::GenericPath LowerHIR_GenericPath(const ::AST::Path& path);
+extern ::HIR::Path LowerHIR_Path(const Span& sp, const ::AST::Path& path);
+extern ::HIR::GenericPath LowerHIR_GenericPath(const Span& sp, const ::AST::Path& path);
extern ::HIR::TypeRef LowerHIR_Type(const ::TypeRef& ty);
extern ::HIR::Pattern LowerHIR_Pattern(const ::AST::Pattern& pat);
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index e52e9194..4213e2f3 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -203,7 +203,7 @@ struct LowerHIR_ExprNode_Visitor:
else
{
m_rv.reset( new ::HIR::ExprNode_CallPath(
- LowerHIR_Path(v.m_path),
+ LowerHIR_Path(Span(v.get_pos()), v.m_path),
mv$( args )
) );
}
@@ -349,6 +349,9 @@ struct LowerHIR_ExprNode_Visitor:
case CORETYPE_INT: return ::HIR::CoreType::Isize;
case CORETYPE_UINT: return ::HIR::CoreType::Usize;
+
+ case CORETYPE_CHAR: return ::HIR::CoreType::Char;
+
default:
BUG(sp, "Unknown type for integer literal");
}
@@ -400,7 +403,7 @@ struct LowerHIR_ExprNode_Visitor:
for(const auto& val : v.m_values)
values.push_back( ::std::make_pair(val.first, LowerHIR_ExprNode_Inner(*val.second)) );
m_rv.reset( new ::HIR::ExprNode_StructLiteral(
- LowerHIR_GenericPath(v.m_path),
+ LowerHIR_GenericPath(v.get_pos(), v.m_path),
LowerHIR_ExprNode_Inner_Opt(v.m_base_value.get()),
mv$(values)
) );
@@ -437,7 +440,7 @@ struct LowerHIR_ExprNode_Visitor:
m_rv.reset( new ::HIR::ExprNode_Variable( e.name, slot ) );
)
else {
- m_rv.reset( new ::HIR::ExprNode_PathValue( LowerHIR_Path(v.m_path) ) );
+ m_rv.reset( new ::HIR::ExprNode_PathValue( LowerHIR_Path(Span(v.get_pos()), v.m_path) ) );
}
}
diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp
index 43e12823..ff0d82a9 100644
--- a/src/hir/hir.hpp
+++ b/src/hir/hir.hpp
@@ -132,6 +132,7 @@ TAGGED_UNION(TraitValueItem, None,
struct Trait
{
GenericParams m_params;
+ ::std::string m_lifetime;
::std::vector< ::HIR::GenericPath > m_parent_traits;
::std::unordered_map< ::std::string, AssociatedType > m_types;
diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp
index 09bc0915..e828827b 100644
--- a/src/resolve/absolute.cpp
+++ b/src/resolve/absolute.cpp
@@ -954,6 +954,10 @@ void Resolve_Absolute_Expr(Context& context, ::AST::ExprNode& node)
void Resolve_Absolute_Generic(Context& context, ::AST::GenericParams& params)
{
+ for( auto& param : params.ty_params() )
+ {
+ Resolve_Absolute_Type(context, param.get_default());
+ }
for( auto& bound : params.bounds() )
{
TU_MATCH(::AST::GenericBound, (bound), (e),