auto merge of : nikomatsakis/rust/type-bounds-b, r=acrichto

This is needed to bootstrap fix for .
This commit is contained in:
bors 2014-05-04 03:41:50 -07:00
commit de99da3fa5
13 changed files with 91 additions and 17 deletions

@ -59,6 +59,10 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[
("quad_precision_float", Active),
// A temporary feature gate used to enable parser extensions needed
// to bootstrap fix for #5723.
("issue_5723_bootstrap", Active),
// These are used to test this portion of the compiler, they don't actually
// mean anything
("test_accepted_feature", Accepted),
@ -80,14 +84,16 @@ enum Status {
/// A set of features to be used by later passes.
pub struct Features {
pub default_type_params: Cell<bool>,
pub quad_precision_float: Cell<bool>
pub quad_precision_float: Cell<bool>,
pub issue_5723_bootstrap: Cell<bool>,
}
impl Features {
pub fn new() -> Features {
Features {
default_type_params: Cell::new(false),
quad_precision_float: Cell::new(false)
quad_precision_float: Cell::new(false),
issue_5723_bootstrap: Cell::new(false),
}
}
}
@ -367,4 +373,5 @@ pub fn check_crate(sess: &Session, krate: &ast::Crate) {
sess.features.default_type_params.set(cx.has_feature("default_type_params"));
sess.features.quad_precision_float.set(cx.has_feature("quad_precision_float"));
sess.features.issue_5723_bootstrap.set(cx.has_feature("issue_5723_bootstrap"));
}

@ -3824,7 +3824,8 @@ impl<'a> Resolver<'a> {
TraitTyParamBound(ref tref) => {
self.resolve_trait_reference(id, tref, TraitBoundingTypeParameter)
}
RegionTyParamBound => {}
StaticRegionTyParamBound => {}
OtherRegionTyParamBound(_) => {}
}
}

@ -898,9 +898,17 @@ fn conv_builtin_bounds(tcx: &ty::ctxt, ast_bounds: &Option<OwnedSlice<ast::TyPar
format!("only the builtin traits can be used \
as closure or object bounds"));
}
ast::RegionTyParamBound => {
ast::StaticRegionTyParamBound => {
builtin_bounds.add(ty::BoundStatic);
}
ast::OtherRegionTyParamBound(span) => {
if !tcx.sess.features.issue_5723_bootstrap.get() {
tcx.sess.span_err(
span,
format!("only the 'static lifetime is \
accepted here."));
}
}
}
}
builtin_bounds

@ -50,7 +50,8 @@ use std::rc::Rc;
use collections::{HashMap, HashSet};
use syntax::abi;
use syntax::ast::{RegionTyParamBound, TraitTyParamBound};
use syntax::ast::{StaticRegionTyParamBound, OtherRegionTyParamBound,
TraitTyParamBound};
use syntax::ast;
use syntax::ast_map;
use syntax::ast_util::{local_def, split_trait_methods};
@ -1102,9 +1103,18 @@ fn ty_generics(ccx: &CrateCtxt,
}
}
RegionTyParamBound => {
StaticRegionTyParamBound => {
param_bounds.builtin_bounds.add(ty::BoundStatic);
}
OtherRegionTyParamBound(span) => {
if !ccx.tcx.sess.features.issue_5723_bootstrap.get() {
ccx.tcx.sess.span_err(
span,
format!("only the 'static lifetime is \
accepted here."));
}
}
}
}

@ -893,7 +893,8 @@ impl<'a> Rebuilder<'a> {
-> OwnedSlice<ast::TyParamBound> {
ty_param_bounds.map(|tpb| {
match tpb {
&ast::RegionTyParamBound => ast::RegionTyParamBound,
&ast::StaticRegionTyParamBound => ast::StaticRegionTyParamBound,
&ast::OtherRegionTyParamBound(s) => ast::OtherRegionTyParamBound(s),
&ast::TraitTyParamBound(ref tr) => {
let last_seg = tr.path.segments.last().unwrap();
let mut insert = Vec::new();

@ -349,7 +349,8 @@ pub enum TyParamBound {
impl Clean<TyParamBound> for ast::TyParamBound {
fn clean(&self) -> TyParamBound {
match *self {
ast::RegionTyParamBound => RegionBound,
ast::StaticRegionTyParamBound => RegionBound,
ast::OtherRegionTyParamBound(_) => RegionBound,
ast::TraitTyParamBound(ref t) => TraitBound(t.clean()),
}
}

@ -173,7 +173,8 @@ pub static DUMMY_NODE_ID: NodeId = -1;
#[deriving(Clone, Eq, TotalEq, Encodable, Decodable, Hash)]
pub enum TyParamBound {
TraitTyParamBound(TraitRef),
RegionTyParamBound
StaticRegionTyParamBound,
OtherRegionTyParamBound(Span) // FIXME -- just here until work for #5723 lands
}
#[deriving(Clone, Eq, TotalEq, Encodable, Decodable, Hash)]

@ -437,7 +437,8 @@ fn fold_ty_param_bound<T: Folder>(tpb: &TyParamBound, fld: &mut T)
-> TyParamBound {
match *tpb {
TraitTyParamBound(ref ty) => TraitTyParamBound(fold_trait_ref(ty, fld)),
RegionTyParamBound => RegionTyParamBound
StaticRegionTyParamBound => StaticRegionTyParamBound,
OtherRegionTyParamBound(s) => OtherRegionTyParamBound(s)
}
}

@ -12,7 +12,7 @@
use abi;
use ast::{BareFnTy, ClosureTy};
use ast::{RegionTyParamBound, TraitTyParamBound};
use ast::{StaticRegionTyParamBound, OtherRegionTyParamBound, TraitTyParamBound};
use ast::{Provided, Public, FnStyle};
use ast::{Mod, BiAdd, Arg, Arm, Attribute, BindByRef, BindByValue};
use ast::{BiBitAnd, BiBitOr, BiBitXor, Block};
@ -3351,7 +3351,7 @@ impl<'a> Parser<'a> {
token::LIFETIME(lifetime) => {
let lifetime_interned_string = token::get_ident(lifetime);
if lifetime_interned_string.equiv(&("static")) {
result.push(RegionTyParamBound);
result.push(StaticRegionTyParamBound);
if allow_any_lifetime && ret_lifetime.is_none() {
ret_lifetime = Some(ast::Lifetime {
id: ast::DUMMY_NODE_ID,
@ -3366,8 +3366,7 @@ impl<'a> Parser<'a> {
name: lifetime.name
});
} else {
self.span_err(self.span,
"`'static` is the only permissible region bound here");
result.push(OtherRegionTyParamBound(self.span));
}
self.bump();
}

@ -9,7 +9,8 @@
// except according to those terms.
use abi;
use ast::{P, RegionTyParamBound, TraitTyParamBound, Required, Provided};
use ast::{P, StaticRegionTyParamBound, OtherRegionTyParamBound,
TraitTyParamBound, Required, Provided};
use ast;
use ast_util;
use owned_slice::OwnedSlice;
@ -1881,7 +1882,8 @@ impl<'a> State<'a> {
try!(match *bound {
TraitTyParamBound(ref tref) => self.print_trait_ref(tref),
RegionTyParamBound => word(&mut self.s, "'static"),
StaticRegionTyParamBound => word(&mut self.s, "'static"),
OtherRegionTyParamBound(_) => Ok(())
})
}
Ok(())

@ -472,7 +472,8 @@ pub fn walk_ty_param_bounds<E: Clone, V: Visitor<E>>(visitor: &mut V,
TraitTyParamBound(ref typ) => {
walk_trait_ref_helper(visitor, typ, env.clone())
}
RegionTyParamBound => {}
StaticRegionTyParamBound => {}
OtherRegionTyParamBound(..) => {}
}
}
}

@ -0,0 +1,19 @@
// 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.
trait Foo { }
fn foo<'a>(x: ~Foo:'a) { //~ ERROR only the 'static lifetime is accepted here
}
fn bar<'a, T:'a>() { //~ ERROR only the 'static lifetime is accepted here
}
fn main() { }

@ -0,0 +1,23 @@
// 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.
// ignore-pretty
#![feature(issue_5723_bootstrap)]
trait Foo { }
fn foo<'a>(x: ~Foo:'a) {
}
fn bar<'a, T:'a>() {
}
pub fn main() { }