summaryrefslogtreecommitdiff
path: root/src/hir/type.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-07-19 19:41:01 +0800
committerJohn Hodge <tpg@mutabah.net>2016-07-19 19:41:01 +0800
commit3fab1f6071718b5456d4c6b33fa5afe8f9a43f71 (patch)
tree8d6c97418b3d97b076a8b70c63d3f157494e9a3b /src/hir/type.cpp
parent394fb3ccec788e2c3abff511d142a9573bc783a6 (diff)
downloadmrust-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.cpp68
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 {