summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-07-03 23:10:08 +0800
committerJohn Hodge <tpg@mutabah.net>2016-07-03 23:20:24 +0800
commit82936afce49890bd3601ff0b55d81c9a25729788 (patch)
treef59154c1d01b191dd35629b249a05ce53b42b773 /src
parenta531b94c43cb795deceb7491558ad6a0b32a0c2d (diff)
downloadmrust-82936afce49890bd3601ff0b55d81c9a25729788.tar.gz
HIR Typecheck CS - Handle literal types in coercion
Diffstat (limited to 'src')
-rw-r--r--src/hir_typeck/expr_cs.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index c86e9903..ed00a675 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -1866,6 +1866,10 @@ namespace {
// 1. Check that the source type can coerce
TU_MATCH( ::HIR::TypeRef::Data, (ty_r.m_data), (e),
(Infer,
+ if( e.ty_class != ::HIR::InferClass::None ) {
+ context.equate_types(sp, ty, ty_r);
+ return true;
+ }
),
(Diverge,
return true;
@@ -1916,7 +1920,13 @@ namespace {
// - Otherwise - Force equality
TU_MATCH( ::HIR::TypeRef::Data, (ty.m_data), (e),
(Infer,
+ if( e.ty_class != ::HIR::InferClass::None ) {
+ context.equate_types(sp, ty, ty_r);
+ return true;
+ }
// Can't do anything yet?
+ // - Later code can handle "only path" coercions
+ return false;
),
(Diverge,
return true;
@@ -1928,6 +1938,7 @@ namespace {
),
(Path,
TODO(Span(), "check_coerce - Coercion to " << ty);
+ // TODO: CoerceUnsized
),
(Generic,
TODO(Span(), "check_coerce - Coercion to " << ty);
@@ -1950,22 +1961,28 @@ namespace {
return true;
),
(Borrow,
- // TODO: Borrows can have unsizing and deref coercions applied
TU_IFLET(::HIR::TypeRef::Data, ty_r.m_data, Borrow, e_r,
-
+ // - Both borrows!
+ // TODO: Various coercion types
+ // - Trait/Slice unsizing
+ // - Deref
+ // - Unsize?
)
else TU_IFLET(::HIR::TypeRef::Data, ty_r.m_data, Infer, e_r,
// Leave for now
)
else {
// Error - Must be compatible
+ // - Hand off to equate
context.equate_types(sp, ty, ty_r);
}
),
(Pointer,
// TODO: Pointers coerce from borrows and similar pointers
+ TODO(sp, "check_coerce - Coercion to " << ty);
),
(Function,
+ // TODO: Could capture-less closures coerce to fn() types?
TODO(sp, "check_coerce - Coercion to " << ty);
),
(Closure,