diff options
author | John Hodge <tpg@mutabah.net> | 2016-07-19 19:41:01 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-07-19 19:41:01 +0800 |
commit | 3fab1f6071718b5456d4c6b33fa5afe8f9a43f71 (patch) | |
tree | 8d6c97418b3d97b076a8b70c63d3f157494e9a3b /src/hir/type.cpp | |
parent | 394fb3ccec788e2c3abff511d142a9573bc783a6 (diff) | |
download | mrust-3fab1f6071718b5456d4c6b33fa5afe8f9a43f71.tar.gz |
HIR - Very rough impl specialisation support in outer typeck
Diffstat (limited to 'src/hir/type.cpp')
-rw-r--r-- | src/hir/type.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/hir/type.cpp b/src/hir/type.cpp index 7695f066..a27d5dd0 100644 --- a/src/hir/type.cpp +++ b/src/hir/type.cpp @@ -351,6 +351,74 @@ Ordering HIR::TypeRef::ord(const ::HIR::TypeRef& x) const ) throw ""; } +bool ::HIR::TypeRef::contains_generics() const +{ + struct H { + static bool vec_contains_generics(const ::std::vector<TypeRef>& v) { + for( const auto& t : v ) + if( t.contains_generics() ) + return true; + return false; + } + }; + TU_MATCH(::HIR::TypeRef::Data, (m_data), (te), + (Infer, + return false; + ), + (Diverge, + return false; + ), + (Primitive, + return false; + ), + (Path, + TU_MATCH(::HIR::Path::Data, (te.path.m_data), (tpe), + (Generic, + return H::vec_contains_generics( tpe.m_params.m_types ); + ), + (UfcsInherent, + if( tpe.type->contains_generics() ) + return true; + TODO(Span(), "UfcsInherent"); + ), + (UfcsKnown, + TODO(Span(), "UfcsKnown"); + ), + (UfcsUnknown, + TODO(Span(), "UfcsUnknown"); + ) + ) + ), + (Generic, + return true; + ), + (TraitObject, + TODO(Span(), "TraitObject"); + ), + (Array, + return te.inner->contains_generics(); + ), + (Slice, + return te.inner->contains_generics(); + ), + (Tuple, + return H::vec_contains_generics(te); + ), + (Borrow, + return te.inner->contains_generics(); + ), + (Pointer, + return te.inner->contains_generics(); + ), + (Function, + return H::vec_contains_generics(te.m_arg_types) || te.m_rettype->contains_generics(); + ), + (Closure, + return H::vec_contains_generics(te.m_arg_types) || te.m_rettype->contains_generics(); + ) + ) + throw ""; +} namespace { |