提交 83710b44 编写于 作者: N Niko Matsakis

permit coercions if `[error]` is found in either type

上级 a3cbfa58
...@@ -68,7 +68,7 @@ ...@@ -68,7 +68,7 @@
use middle::ty::adjustment::{AutoAdjustment, AutoDerefRef, AdjustDerefRef}; use middle::ty::adjustment::{AutoAdjustment, AutoDerefRef, AdjustDerefRef};
use middle::ty::adjustment::{AutoPtr, AutoUnsafe, AdjustReifyFnPointer}; use middle::ty::adjustment::{AutoPtr, AutoUnsafe, AdjustReifyFnPointer};
use middle::ty::adjustment::{AdjustUnsafeFnPointer}; use middle::ty::adjustment::{AdjustUnsafeFnPointer};
use middle::ty::{self, LvaluePreference, TypeAndMut, Ty}; use middle::ty::{self, LvaluePreference, TypeAndMut, Ty, HasTypeFlags};
use middle::ty::error::TypeError; use middle::ty::error::TypeError;
use middle::ty::relate::RelateResult; use middle::ty::relate::RelateResult;
use util::common::indent; use util::common::indent;
...@@ -110,10 +110,15 @@ fn coerce(&self, ...@@ -110,10 +110,15 @@ fn coerce(&self,
a, a,
b); b);
let a = self.fcx.infcx().shallow_resolve(a);
// Just ignore error types.
if a.references_error() || b.references_error() {
return Ok(None);
}
// Consider coercing the subtype to a DST // Consider coercing the subtype to a DST
let unsize = self.unpack_actual_value(a, |a| { let unsize = self.coerce_unsized(a, b);
self.coerce_unsized(a, b)
});
if unsize.is_ok() { if unsize.is_ok() {
return unsize; return unsize;
} }
...@@ -124,39 +129,33 @@ fn coerce(&self, ...@@ -124,39 +129,33 @@ fn coerce(&self,
// See above for details. // See above for details.
match b.sty { match b.sty {
ty::TyRawPtr(mt_b) => { ty::TyRawPtr(mt_b) => {
return self.unpack_actual_value(a, |a| { return self.coerce_unsafe_ptr(a, b, mt_b.mutbl);
self.coerce_unsafe_ptr(a, b, mt_b.mutbl)
});
} }
ty::TyRef(_, mt_b) => { ty::TyRef(_, mt_b) => {
return self.unpack_actual_value(a, |a| { return self.coerce_borrowed_pointer(expr_a, a, b, mt_b.mutbl);
self.coerce_borrowed_pointer(expr_a, a, b, mt_b.mutbl)
});
} }
_ => {} _ => {}
} }
self.unpack_actual_value(a, |a| { match a.sty {
match a.sty { ty::TyBareFn(Some(_), a_f) => {
ty::TyBareFn(Some(_), a_f) => { // Function items are coercible to any closure
// Function items are coercible to any closure // type; function pointers are not (that would
// type; function pointers are not (that would // require double indirection).
// require double indirection). self.coerce_from_fn_item(a, a_f, b)
self.coerce_from_fn_item(a, a_f, b)
}
ty::TyBareFn(None, a_f) => {
// We permit coercion of fn pointers to drop the
// unsafe qualifier.
self.coerce_from_fn_pointer(a, a_f, b)
}
_ => {
// Otherwise, just use subtyping rules.
self.subtype(a, b)
}
} }
}) ty::TyBareFn(None, a_f) => {
// We permit coercion of fn pointers to drop the
// unsafe qualifier.
self.coerce_from_fn_pointer(a, a_f, b)
}
_ => {
// Otherwise, just use subtyping rules.
self.subtype(a, b)
}
}
} }
/// Reborrows `&mut A` to `&mut B` and `&(mut) A` to `&B`. /// Reborrows `&mut A` to `&mut B` and `&(mut) A` to `&B`.
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
fn akemi(homura: Homura) { fn akemi(homura: Homura) {
let Some(ref madoka) = Some(homura.kaname()); //~ ERROR no method named `kaname` found let Some(ref madoka) = Some(homura.kaname()); //~ ERROR no method named `kaname` found
madoka.clone(); madoka.clone(); //~ ERROR the type of this value must be known
} }
fn main() { } fn main() { }
...@@ -31,5 +31,5 @@ fn to_string(&self) -> String { ...@@ -31,5 +31,5 @@ fn to_string(&self) -> String {
fn main() { fn main() {
let p = Point::new(0.0, 0.0); let p = Point::new(0.0, 0.0);
//~^ ERROR no associated item named `new` found for type `Point` in the current scope //~^ ERROR no associated item named `new` found for type `Point` in the current scope
println!("{}", p.to_string()); println!("{}", p.to_string()); //~ ERROR type of this value must be known
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册