auto merge of #19466 : nikomatsakis/rust/recursion-limit, r=eddyb
This is particularly important for deeply nested types, which generate deeply nested impls. This is a fix for #19318. It's possible we could also improve this particular case not to increment the recursion count, but it's worth being able to adjust the recursion limit anyhow. cc @jdm r? @pcwalton
This commit is contained in:
commit
ef4982f0f8
8 changed files with 126 additions and 294 deletions
51
src/test/compile-fail/recursion_limit.rs
Normal file
51
src/test/compile-fail/recursion_limit.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
// Test that the recursion limit can be changed. In this case, we have
|
||||
// deeply nested types that will fail the `Send` check by overflow
|
||||
// when the recursion limit is set very low.
|
||||
|
||||
#![feature(macro_rules)]
|
||||
#![allow(dead_code)]
|
||||
#![recursion_limit="10"]
|
||||
|
||||
macro_rules! link {
|
||||
($id:ident, $t:ty) => {
|
||||
enum $id { $id($t) }
|
||||
}
|
||||
}
|
||||
|
||||
link!(A,B)
|
||||
link!(B,C)
|
||||
link!(C,D)
|
||||
link!(D,E)
|
||||
link!(E,F)
|
||||
link!(F,G)
|
||||
link!(G,H)
|
||||
link!(H,I)
|
||||
link!(I,J)
|
||||
link!(J,K)
|
||||
link!(K,L)
|
||||
link!(L,M)
|
||||
link!(M,N)
|
||||
|
||||
enum N { N(uint) }
|
||||
|
||||
fn is_send<T:Send>() { }
|
||||
|
||||
fn main() {
|
||||
is_send::<A>();
|
||||
//~^ ERROR overflow evaluating
|
||||
//~^^ NOTE consider adding a `#![recursion_limit="20"]` attribute to your crate
|
||||
//~^^^ NOTE must be implemented
|
||||
//~^^^^ ERROR overflow evaluating
|
||||
//~^^^^^ NOTE consider adding a `#![recursion_limit="20"]` attribute to your crate
|
||||
//~^^^^^^ NOTE must be implemented
|
||||
}
|
||||
|
|
@ -14,6 +14,6 @@ use std::ops::FnMut;
|
|||
|
||||
pub fn main() {
|
||||
let mut f = |&mut: x: int, y: int| -> int { x + y };
|
||||
let z = f.call_mut((1u, 2)); //~ ERROR not implemented
|
||||
let z = f.call_mut((1u, 2)); //~ ERROR type mismatch
|
||||
println!("{}", z);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ fn call_it<F:FnMut<(int,int),int>>(y: int, mut f: F) -> int {
|
|||
|
||||
pub fn main() {
|
||||
let f = |&mut: x: uint, y: int| -> int { (x as int) + y };
|
||||
let z = call_it(3, f); //~ ERROR not implemented
|
||||
let z = call_it(3, f); //~ ERROR type mismatch
|
||||
println!("{}", z);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue