diff options
author | John Hodge <tpg@mutabah.net> | 2016-06-11 15:00:51 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-06-11 15:00:51 +0800 |
commit | eea8d7e37ffdb8886e4dc3ab1c1c715df3935ca8 (patch) | |
tree | f6bc07241845027de9482115dc588a93cc8d7da1 /src/hir/from_ast.cpp | |
parent | 5585040f36b6f8ffd6c0c44689525ce29ccb74d9 (diff) | |
download | mrust-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.cpp | 20 |
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) }; |