summaryrefslogtreecommitdiff
path: root/src/hir/from_ast.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-06-11 15:00:51 +0800
committerJohn Hodge <tpg@mutabah.net>2016-06-11 15:00:51 +0800
commiteea8d7e37ffdb8886e4dc3ab1c1c715df3935ca8 (patch)
treef6bc07241845027de9482115dc588a93cc8d7da1 /src/hir/from_ast.cpp
parent5585040f36b6f8ffd6c0c44689525ce29ccb74d9 (diff)
downloadmrust-eea8d7e37ffdb8886e4dc3ab1c1c715df3935ca8.tar.gz
HIR Typecheck - Fixes for `trait Int: Add<Self>`
Diffstat (limited to 'src/hir/from_ast.cpp')
-rw-r--r--src/hir/from_ast.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 4b52cd22..d7f95d81 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -733,20 +733,34 @@ const ::HIR::SimplePath path_Sized = ::HIR::SimplePath("", {"marker", "Sized"});
}
::HIR::Trait LowerHIR_Trait(::HIR::SimplePath trait_path, const ::AST::Trait& f)
{
- ::std::string lifetime;
+ bool trait_reqires_sized = false;
+ auto params = LowerHIR_GenericParams(f.params(), &trait_reqires_sized);
+ ::std::string lifetime;
::std::vector< ::HIR::GenericPath> supertraits;
for(const auto& st : f.supertraits()) {
if( st.ent.is_valid() ) {
supertraits.push_back( LowerHIR_GenericPath(st.sp, st.ent) );
+ const auto& atype_bounds = st.ent.nodes().back().args().m_assoc;
+ for(const auto& atype : atype_bounds)
+ {
+ params.m_bounds.push_back( ::HIR::GenericBound::make_TypeEquality({
+ ::HIR::TypeRef(::HIR::Path(::HIR::Path::Data::make_UfcsKnown({
+ box$( ::HIR::TypeRef("Self",0xFFFF) ),
+ supertraits.back().clone(),
+ atype.first,
+ {}
+ }))),
+ LowerHIR_Type(atype.second)
+ }) );
+ }
}
else {
lifetime = "static";
}
}
- bool trait_reqires_sized = false;
::HIR::Trait rv {
- LowerHIR_GenericParams(f.params(), &trait_reqires_sized),
+ mv$(params),
mv$(lifetime),
mv$(supertraits)
};