From d26f6eddfde6b9f0e2f011d4666a3f7c98ae1048 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 26 Feb 2013 14:41:23 -0500 Subject: [PATCH] Convert region parameterization to change defaults and handle methods correctly --- src/librustc/middle/typeck/astconv.rs | 5 ++-- src/librustc/middle/typeck/check/mod.rs | 4 +-- src/librustc/middle/typeck/rscope.rs | 37 ++++--------------------- 3 files changed, 9 insertions(+), 37 deletions(-) diff --git a/src/librustc/middle/typeck/astconv.rs b/src/librustc/middle/typeck/astconv.rs index a232aa764dd..e018cf6f940 100644 --- a/src/librustc/middle/typeck/astconv.rs +++ b/src/librustc/middle/typeck/astconv.rs @@ -57,7 +57,7 @@ use core::prelude::*; use middle::ty::{arg, field, substs}; use middle::ty::{ty_param_substs_and_ty}; use middle::ty; -use middle::typeck::rscope::{in_anon_rscope, in_binding_rscope}; +use middle::typeck::rscope::{in_binding_rscope}; use middle::typeck::rscope::{region_scope, type_rscope}; use middle::typeck::{CrateCtxt, write_substs_to_tcx, write_ty_to_tcx}; @@ -315,8 +315,7 @@ pub fn ast_ty_to_ty( } ast::ty_rptr(region, mt) => { let r = ast_region_to_region(self, rscope, ast_ty.span, region); - let anon_rscope = in_anon_rscope(rscope, r); - mk_pointer(self, &anon_rscope, mt, ty::vstore_slice(r), + mk_pointer(self, rscope, mt, ty::vstore_slice(r), |tmt| ty::mk_rptr(tcx, r, tmt)) } ast::ty_tup(fields) => { diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 45c0992cc9b..2cb06e783dd 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +n// 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. // @@ -95,7 +95,7 @@ use middle::typeck::check::vtable::{LocationInfo, VtableContext}; use middle::typeck::CrateCtxt; use middle::typeck::infer::{resolve_type, force_tvar}; use middle::typeck::infer; -use middle::typeck::rscope::{anon_rscope, binding_rscope, bound_self_region}; +use middle::typeck::rscope::{binding_rscope, bound_self_region}; use middle::typeck::rscope::{in_binding_rscope, region_scope, type_rscope}; use middle::typeck::rscope; use middle::typeck::{isr_alist, lookup_def_ccx, method_map_entry}; diff --git a/src/librustc/middle/typeck/rscope.rs b/src/librustc/middle/typeck/rscope.rs index 84c68197e0c..77da34a31e9 100644 --- a/src/librustc/middle/typeck/rscope.rs +++ b/src/librustc/middle/typeck/rscope.rs @@ -27,7 +27,7 @@ pub trait region_scope { pub enum empty_rscope { empty_rscope } impl region_scope for empty_rscope { fn anon_region(&self, _span: span) -> Result { - Ok(ty::re_static) + result::Err(~"only the static region is allowed here") } fn self_region(&self, _span: span) -> Result { result::Err(~"only the static region is allowed here") @@ -62,14 +62,14 @@ impl region_scope for MethodRscope { pub enum type_rscope = Option; impl region_scope for type_rscope { fn anon_region(&self, _span: span) -> Result { - // if the anon or self region is used, region parameterization should + result::Err(~"anonymous region types are not permitted here") + } + fn self_region(&self, _span: span) -> Result { + // if the self region is used, region parameterization should // have inferred that this type is RP assert self.is_some(); result::Ok(ty::re_bound(ty::br_self)) } - fn self_region(&self, span: span) -> Result { - self.anon_region(span) - } fn named_region(&self, span: span, id: ast::ident) -> Result { do empty_rscope.named_region(span, id).chain_err |_e| { @@ -87,33 +87,6 @@ pub fn bound_self_region(rp: Option) } } -pub struct anon_rscope { anon: ty::Region, base: @region_scope } -pub fn in_anon_rscope( - self: &RS, - r: ty::Region) -> anon_rscope -{ - let base = @(copy *self) as @region_scope; - anon_rscope {anon: r, base: base} -} -impl region_scope for anon_rscope { - fn anon_region(&self, - _span: span) -> Result - { - result::Ok(self.anon) - } - fn self_region(&self, - span: span) -> Result - { - self.base.self_region(span) - } - fn named_region(&self, - span: span, - id: ast::ident) -> Result - { - self.base.named_region(span, id) - } -} - pub struct binding_rscope { base: @region_scope, anon_bindings: @mut uint,