auto merge of #6992 : Blei/rust/fix-autoderef-ice, r=catamorphism
Related to #5062, but doesn't fix that one.
This commit is contained in:
commit
4aa77198cb
@ -3044,15 +3044,17 @@ pub fn adjust_ty(cx: ctxt,
|
||||
Some(@AutoDerefRef(ref adj)) => {
|
||||
let mut adjusted_ty = unadjusted_ty;
|
||||
|
||||
for uint::range(0, adj.autoderefs) |i| {
|
||||
match ty::deref(cx, adjusted_ty, true) {
|
||||
Some(mt) => { adjusted_ty = mt.ty; }
|
||||
None => {
|
||||
cx.sess.span_bug(
|
||||
span,
|
||||
fmt!("The %uth autoderef failed: %s",
|
||||
i, ty_to_str(cx,
|
||||
adjusted_ty)));
|
||||
if (!ty::type_is_error(adjusted_ty)) {
|
||||
for uint::range(0, adj.autoderefs) |i| {
|
||||
match ty::deref(cx, adjusted_ty, true) {
|
||||
Some(mt) => { adjusted_ty = mt.ty; }
|
||||
None => {
|
||||
cx.sess.span_bug(
|
||||
span,
|
||||
fmt!("The %uth autoderef failed: %s",
|
||||
i, ty_to_str(cx,
|
||||
adjusted_ty)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -460,6 +460,10 @@ fn constrain_call(rcx: @mut Rcx,
|
||||
debug!("constrain_call(call_expr=%s, implicitly_ref_args=%?)",
|
||||
call_expr.repr(tcx), implicitly_ref_args);
|
||||
let callee_ty = rcx.resolve_node_type(callee_id);
|
||||
if ty::type_is_error(callee_ty) {
|
||||
// Bail, as function type is unknown
|
||||
return;
|
||||
}
|
||||
let fn_sig = ty::ty_fn_sig(callee_ty);
|
||||
|
||||
// `callee_region` is the scope representing the time in which the
|
||||
@ -1108,6 +1112,12 @@ pub mod guarantor {
|
||||
-> ExprCategorizationType {
|
||||
let mut ct = ct;
|
||||
let tcx = rcx.fcx.ccx.tcx;
|
||||
|
||||
if (ty::type_is_error(ct.ty)) {
|
||||
ct.cat.pointer = NotPointer;
|
||||
return ct;
|
||||
}
|
||||
|
||||
for uint::range(0, autoderefs) |_| {
|
||||
ct.cat.guarantor = guarantor_of_deref(&ct.cat);
|
||||
|
||||
|
15
src/test/compile-fail/unconstrained-none.rs
Normal file
15
src/test/compile-fail/unconstrained-none.rs
Normal file
@ -0,0 +1,15 @@
|
||||
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// Issue #5062
|
||||
|
||||
fn main() {
|
||||
fmt!("%?", None); //~ ERROR cannot determine a type for this expression: unconstrained type
|
||||
}
|
17
src/test/compile-fail/unconstrained-ref.rs
Normal file
17
src/test/compile-fail/unconstrained-ref.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
struct S<'self, T> {
|
||||
o: &'self Option<T>
|
||||
}
|
||||
|
||||
fn main() {
|
||||
S { o: &None }; //~ ERROR cannot determine a type for this expression: unconstrained type
|
||||
}
|
Loading…
Reference in New Issue
Block a user