parent
2e996ffb46
commit
87edbea9da
4 changed files with 91 additions and 0 deletions
|
@ -88,6 +88,7 @@ pub mod middle {
|
|||
pub mod privacy;
|
||||
pub mod reachable;
|
||||
pub mod region;
|
||||
pub mod recursion_limit;
|
||||
pub mod resolve;
|
||||
pub mod resolve_lifetime;
|
||||
pub mod stability;
|
||||
|
|
39
src/librustc/middle/recursion_limit.rs
Normal file
39
src/librustc/middle/recursion_limit.rs
Normal file
|
@ -0,0 +1,39 @@
|
|||
// 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.
|
||||
|
||||
// Recursion limit.
|
||||
//
|
||||
// There are various parts of the compiler that must impose arbitrary limits
|
||||
// on how deeply they recurse to prevent stack overflow. Users can override
|
||||
// this via an attribute on the crate like `#![recursion_limit(22)]`. This pass
|
||||
// just peeks and looks for that attribute.
|
||||
|
||||
use session::Session;
|
||||
use syntax::ast;
|
||||
use syntax::attr::AttrMetaMethods;
|
||||
use std::str::FromStr;
|
||||
|
||||
pub fn update_recursion_limit(sess: &Session, krate: &ast::Crate) {
|
||||
for attr in krate.attrs.iter() {
|
||||
if !attr.check_name("recursion_limit") {
|
||||
continue;
|
||||
}
|
||||
|
||||
if let Some(s) = attr.value_str() {
|
||||
if let Some(n) = FromStr::from_str(s.get()) {
|
||||
sess.recursion_limit.set(n);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sess.span_err(attr.span, "malformed recursion limit attribute, \
|
||||
expected #![recursion_limit(\"N\")]");
|
||||
}
|
||||
}
|
|
@ -180,6 +180,10 @@ pub fn phase_2_configure_and_expand(sess: &Session,
|
|||
*sess.features.borrow_mut() = features;
|
||||
});
|
||||
|
||||
time(time_passes, "recursion limit", (), |_| {
|
||||
middle::recursion_limit::update_recursion_limit(sess, &krate);
|
||||
});
|
||||
|
||||
// strip before expansion to allow macros to depend on
|
||||
// configuration variables e.g/ in
|
||||
//
|
||||
|
|
47
src/test/compile-fail/recursion_limit.rs
Normal file
47
src/test/compile-fail/recursion_limit.rs
Normal file
|
@ -0,0 +1,47 @@
|
|||
// 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 not implemented
|
||||
//~^^ ERROR not implemented
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue