diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs index 5d84d0c7797..159c2a505d5 100644 --- a/src/libcore/clone.rs +++ b/src/libcore/clone.rs @@ -25,7 +25,7 @@ use kinds::Sized; /// A common trait for cloning an object. #[stable] -pub trait Clone { +pub trait Clone : Sized { /// Returns a copy of the value. #[stable] fn clone(&self) -> Self; diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index 87fcb12e29f..43f0d72eeba 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -74,7 +74,26 @@ pub trait FormatWriter { /// /// This method should generally not be invoked manually, but rather through /// the `write!` macro itself. - fn write_fmt(&mut self, args: Arguments) -> Result { write(self, args) } + fn write_fmt(&mut self, args: Arguments) -> Result { + // This Adapter is needed to allow `self` (of type `&mut + // Self`) to be cast to a FormatWriter (below) without + // requiring a `Sized` bound. + struct Adapter<'a,Sized? T:'a>(&'a mut T); + + impl<'a, Sized? T> FormatWriter for Adapter<'a, T> + where T: FormatWriter + { + fn write(&mut self, bytes: &[u8]) -> Result { + self.0.write(bytes) + } + + fn write_fmt(&mut self, args: Arguments) -> Result { + self.0.write_fmt(args) + } + } + + write(&mut Adapter(self), args) + } } /// A struct to represent both where to emit formatting strings to and how they diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index 7c53503b1ce..229777f6843 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -65,6 +65,7 @@ use num::{ToPrimitive, Int}; use ops::{Add, Deref, FnMut}; use option::Option; use option::Option::{Some, None}; +use std::kinds::Sized; use uint; #[deprecated = "renamed to Extend"] pub use self::Extend as Extendable; @@ -109,7 +110,7 @@ pub trait Extend { #[unstable = "new convention for extension traits"] /// An extension trait providing numerous methods applicable to all iterators. -pub trait IteratorExt: Iterator { +pub trait IteratorExt: Iterator + Sized { /// Chain this iterator with another, returning a new iterator that will /// finish iterating over the current iterator, and then iterate /// over the other specified iterator. @@ -692,7 +693,7 @@ impl IteratorExt for I where I: Iterator {} /// Extention trait for iterators of pairs. #[unstable = "newly added trait, likely to be merged with IteratorExt"] -pub trait IteratorPairExt: Iterator<(A, B)> { +pub trait IteratorPairExt: Iterator<(A, B)> + Sized { /// Converts an iterator of pairs into a pair of containers. /// /// Loops through the entire iterator, collecting the first component of @@ -738,7 +739,7 @@ pub trait DoubleEndedIterator: Iterator { /// Extension methods for double-ended iterators. #[unstable = "new extension trait convention"] -pub trait DoubleEndedIteratorExt: DoubleEndedIterator { +pub trait DoubleEndedIteratorExt: DoubleEndedIterator + Sized { /// Change the direction of the iterator /// /// The flipped iterator swaps the ends on an iterator that can already diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 0d2ce4f6071..d16478dd6cc 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -980,7 +980,7 @@ impl_to_primitive_float! { f64 } /// A generic trait for converting a number to a value. #[experimental = "trait is likely to be removed"] -pub trait FromPrimitive { +pub trait FromPrimitive : ::kinds::Sized { /// Convert an `int` to return an optional value of this type. If the /// value cannot be represented by this value, the `None` is returned. #[inline] diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index faf1d781465..38e47a5ad33 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -92,7 +92,7 @@ use mem; use clone::Clone; use intrinsics; use option::Option::{mod, Some, None}; -use kinds::{Send, Sync}; +use kinds::{Send, Sized, Sync}; use cmp::{PartialEq, Eq, Ord, PartialOrd, Equiv}; use cmp::Ordering::{mod, Less, Equal, Greater}; @@ -243,7 +243,7 @@ pub unsafe fn write(dst: *mut T, src: T) { /// Methods on raw pointers #[stable] -pub trait PtrExt { +pub trait PtrExt : Sized { /// Returns the null pointer. #[deprecated = "call ptr::null instead"] fn null() -> Self; diff --git a/src/librand/lib.rs b/src/librand/lib.rs index 568d2459118..bbcd99afdea 100644 --- a/src/librand/lib.rs +++ b/src/librand/lib.rs @@ -52,14 +52,14 @@ pub mod reseeding; mod rand_impls; /// A type that can be randomly generated using an `Rng`. -pub trait Rand { +pub trait Rand : Sized { /// Generates a random instance of this type using the specified source of /// randomness. fn rand(rng: &mut R) -> Self; } /// A random number generator. -pub trait Rng { +pub trait Rng : Sized { /// Return the next random u32. /// /// This rarely needs to be called directly, prefer `r.gen()` to diff --git a/src/librustc/middle/infer/combine.rs b/src/librustc/middle/infer/combine.rs index e0bcdfc6d8d..ab6f6b601f6 100644 --- a/src/librustc/middle/infer/combine.rs +++ b/src/librustc/middle/infer/combine.rs @@ -57,7 +57,7 @@ use syntax::ast; use syntax::abi; use syntax::codemap::Span; -pub trait Combine<'tcx> { +pub trait Combine<'tcx> : Sized { fn infcx<'a>(&'a self) -> &'a InferCtxt<'a, 'tcx>; fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx> { self.infcx().tcx } fn tag(&self) -> String; diff --git a/src/librustc/middle/subst.rs b/src/librustc/middle/subst.rs index 3c5459ff3bc..97e74b9f6bb 100644 --- a/src/librustc/middle/subst.rs +++ b/src/librustc/middle/subst.rs @@ -519,7 +519,7 @@ impl<'a,T> Iterator<(ParamSpace, uint, &'a T)> for EnumeratedItems<'a,T> { // `foo`. Or use `foo.subst_spanned(tcx, substs, Some(span))` when // there is more information available (for better errors). -pub trait Subst<'tcx> { +pub trait Subst<'tcx> : Sized { fn subst(&self, tcx: &ty::ctxt<'tcx>, substs: &Substs<'tcx>) -> Self { self.subst_spanned(tcx, substs, None) } diff --git a/src/librustc/middle/ty_fold.rs b/src/librustc/middle/ty_fold.rs index 83d2f6fb0e6..7b13bea7d79 100644 --- a/src/librustc/middle/ty_fold.rs +++ b/src/librustc/middle/ty_fold.rs @@ -56,7 +56,7 @@ pub trait TypeFoldable<'tcx> { /// default implementation that does an "identity" fold. Within each /// identity fold, it should invoke `foo.fold_with(self)` to fold each /// sub-item. -pub trait TypeFolder<'tcx> { +pub trait TypeFolder<'tcx> : Sized { fn tcx<'a>(&'a self) -> &'a ty::ctxt<'tcx>; /// Invoked by the `super_*` routines when we enter a region diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index 773ea30d401..a89292cfacb 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -141,7 +141,7 @@ impl PpSourceMode { } } -trait PrinterSupport<'ast>: pprust::PpAnn { +trait PrinterSupport<'ast>: pprust::PpAnn + Sized { /// Provides a uniform interface for re-extracting a reference to a /// `Session` from a value that now owns it. fn sess<'a>(&'a self) -> &'a Session; diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs index 5623c0f0e53..4f277cc868a 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -12,7 +12,7 @@ use clean::*; use std::iter::Extend; use std::mem::{replace, swap}; -pub trait DocFolder { +pub trait DocFolder : Sized { fn fold_item(&mut self, item: Item) -> Option { self.fold_item_recur(item) } diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index e8b852ee492..cc8a67249d4 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -232,6 +232,7 @@ use error::{FromError, Error}; use fmt; use int; use iter::{Iterator, IteratorExt}; +use kinds::Sized; use mem::transmute; use ops::{BitOr, BitXor, BitAnd, Sub, Not, FnOnce}; use option::Option; @@ -1030,11 +1031,25 @@ pub trait Writer { fn write_fmt(&mut self, fmt: fmt::Arguments) -> IoResult<()> { // Create a shim which translates a Writer to a FormatWriter and saves // off I/O errors. instead of discarding them - struct Adaptor<'a, T:'a> { + struct Adaptor<'a, Sized? T:'a> { inner: &'a mut T, error: IoResult<()>, } + #[cfg(not(stage0))] + impl<'a, Sized? T: Writer> fmt::FormatWriter for Adaptor<'a, T> { + fn write(&mut self, bytes: &[u8]) -> fmt::Result { + match self.inner.write(bytes) { + Ok(()) => Ok(()), + Err(e) => { + self.error = Err(e); + Err(fmt::Error) + } + } + } + } + + #[cfg(stage0)] impl<'a, T: Writer> fmt::FormatWriter for Adaptor<'a, T> { fn write(&mut self, bytes: &[u8]) -> fmt::Result { match self.inner.write(bytes) { @@ -1629,16 +1644,24 @@ pub trait Acceptor { /// `Some`. The `Some` contains the `IoResult` representing whether the /// connection attempt was successful. A successful connection will be wrapped /// in `Ok`. A failed connection is represented as an `Err`. -pub struct IncomingConnections<'a, A:'a> { +pub struct IncomingConnections<'a, Sized? A:'a> { inc: &'a mut A, } +#[cfg(stage0)] impl<'a, T, A: Acceptor> Iterator> for IncomingConnections<'a, A> { fn next(&mut self) -> Option> { Some(self.inc.accept()) } } +#[cfg(not(stage0))] +impl<'a, T, Sized? A: Acceptor> Iterator> for IncomingConnections<'a, A> { + fn next(&mut self) -> Option> { + Some(self.inc.accept()) + } +} + /// Creates a standard error for a commonly used flavor of error. The `detail` /// field of the returned error will always be `None`. /// diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 4f0169e31f2..5234837a456 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -53,7 +53,7 @@ impl MoveMap for OwnedSlice { } } -pub trait Folder { +pub trait Folder : Sized { // Any additions to this trait should happen in form // of a call to a public `noop_*` function that only calls // out to the folder again, not other `noop_*` functions. diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 40ca6354ca6..0b4a1fbdd22 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -54,8 +54,7 @@ pub enum FnKind<'a> { /// explicitly, you need to override each method. (And you also need /// to monitor future changes to `Visitor` in case a new method with a /// new default implementation gets introduced.) -pub trait Visitor<'v> { - +pub trait Visitor<'v> : Sized { fn visit_name(&mut self, _span: Span, _name: Name) { // Nothing to do. }