diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs index 5d84d0c7797e..159c2a505d51 100644 --- a/src/libcore/clone.rs +++ b/src/libcore/clone.rs @@ -25,7 +25,7 @@ /// 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 87fcb12e29f9..43f0d72eeba9 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 7c53503b1ceb..229777f68431 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -65,6 +65,7 @@ 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 0d2ce4f60718..d16478dd6cc7 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -980,7 +980,7 @@ fn to_f64(&self) -> Option { impl_to_primitive_float_to_float!($T, f64, *se /// 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 faf1d781465c..38e47a5ad334 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -92,7 +92,7 @@ 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 568d24591182..bbcd99afdea9 100644 --- a/src/librand/lib.rs +++ b/src/librand/lib.rs @@ -52,14 +52,14 @@ 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 e0bcdfc6d8d9..ab6f6b601f6d 100644 --- a/src/librustc/middle/infer/combine.rs +++ b/src/librustc/middle/infer/combine.rs @@ -57,7 +57,7 @@ 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 3c5459ff3bc7..97e74b9f6bbb 100644 --- a/src/librustc/middle/subst.rs +++ b/src/librustc/middle/subst.rs @@ -519,7 +519,7 @@ fn next(&mut self) -> Option<(ParamSpace, uint, &'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 83d2f6fb0e6d..7b13bea7d79c 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 773ea30d401f..a89292cfacbb 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -141,7 +141,7 @@ fn call_with_pp_support<'tcx, A, B, F>(&self, } } -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 5623c0f0e535..4f277cc868a1 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -12,7 +12,7 @@ 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 e8b852ee492b..cc8a67249d4c 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -232,6 +232,7 @@ 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 @@ fn flush(&mut self) -> IoResult<()> { Ok(()) } 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 @@ fn incoming<'r>(&'r mut self) -> IncomingConnections<'r, Self> { /// `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 4f0169e31f22..5234837a456c 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -53,7 +53,7 @@ fn move_map(self, f: F) -> OwnedSlice where F: FnMut(T) -> T { } } -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 40ca6354ca6d..0b4a1fbdd229 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. }