From b8a53b5a4cb594326ec90feb960d018e7ae23f2a Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 30 May 2013 20:03:01 -0400 Subject: [PATCH 1/3] Add 'Sized' builtin kind; doesn't do anything yet --- src/librustc/metadata/tydecode.rs | 3 + src/librustc/metadata/tyencode.rs | 1 + src/librustc/middle/lang_items.rs | 144 ++++++++++++++------------ src/librustc/middle/ty.rs | 66 ++++++++++-- src/librustc/middle/typeck/astconv.rs | 3 + src/librustc/util/ppaux.rs | 4 +- src/libstd/kinds.rs | 5 + src/libstd/prelude.rs | 2 +- 8 files changed, 147 insertions(+), 81 deletions(-) diff --git a/src/librustc/metadata/tydecode.rs b/src/librustc/metadata/tydecode.rs index f26a52cd8cd3..33e033ace483 100644 --- a/src/librustc/metadata/tydecode.rs +++ b/src/librustc/metadata/tydecode.rs @@ -569,6 +569,9 @@ fn parse_bounds(st: @mut PState, conv: conv_did) -> ty::ParamBounds { 'O' => { param_bounds.builtin_bounds.add(ty::BoundStatic); } + 'Z' => { + param_bounds.builtin_bounds.add(ty::BoundSized); + } 'I' => { param_bounds.trait_bounds.push(@parse_trait_ref(st, conv)); } diff --git a/src/librustc/metadata/tyencode.rs b/src/librustc/metadata/tyencode.rs index eb76b15dd28e..947c68634148 100644 --- a/src/librustc/metadata/tyencode.rs +++ b/src/librustc/metadata/tyencode.rs @@ -403,6 +403,7 @@ fn enc_bounds(w: @io::Writer, cx: @ctxt, bs: &ty::ParamBounds) { ty::BoundCopy => w.write_char('C'), ty::BoundConst => w.write_char('K'), ty::BoundStatic => w.write_char('O'), + ty::BoundSized => w.write_char('Z'), } } diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs index 3a0f6f5c10aa..be1aa957666f 100644 --- a/src/librustc/middle/lang_items.rs +++ b/src/librustc/middle/lang_items.rs @@ -36,55 +36,56 @@ pub enum LangItem { ConstTraitLangItem, // 0 CopyTraitLangItem, // 1 OwnedTraitLangItem, // 2 + SizedTraitLangItem, // 3 - DropTraitLangItem, // 3 + DropTraitLangItem, // 4 - AddTraitLangItem, // 4 - SubTraitLangItem, // 5 - MulTraitLangItem, // 6 - DivTraitLangItem, // 7 - RemTraitLangItem, // 8 - NegTraitLangItem, // 9 - NotTraitLangItem, // 10 + AddTraitLangItem, // 5 + SubTraitLangItem, // 6 + MulTraitLangItem, // 7 + DivTraitLangItem, // 8 + RemTraitLangItem, // 9 + NegTraitLangItem, // 10 + NotTraitLangItem, // 11 BitXorTraitLangItem, // 11 - BitAndTraitLangItem, // 12 - BitOrTraitLangItem, // 13 - ShlTraitLangItem, // 14 - ShrTraitLangItem, // 15 - IndexTraitLangItem, // 16 + BitAndTraitLangItem, // 13 + BitOrTraitLangItem, // 14 + ShlTraitLangItem, // 15 + ShrTraitLangItem, // 16 + IndexTraitLangItem, // 17 - EqTraitLangItem, // 17 - OrdTraitLangItem, // 18 + EqTraitLangItem, // 18 + OrdTraitLangItem, // 19 - StrEqFnLangItem, // 19 - UniqStrEqFnLangItem, // 20 - AnnihilateFnLangItem, // 21 - LogTypeFnLangItem, // 22 - FailFnLangItem, // 23 - FailBoundsCheckFnLangItem, // 24 - ExchangeMallocFnLangItem, // 25 - ExchangeFreeFnLangItem, // 26 - MallocFnLangItem, // 27 - FreeFnLangItem, // 28 - BorrowAsImmFnLangItem, // 29 - BorrowAsMutFnLangItem, // 30 - ReturnToMutFnLangItem, // 31 - CheckNotBorrowedFnLangItem, // 32 - StrDupUniqFnLangItem, // 33 - RecordBorrowFnLangItem, // 34 - UnrecordBorrowFnLangItem, // 35 + StrEqFnLangItem, // 20 + UniqStrEqFnLangItem, // 21 + AnnihilateFnLangItem, // 22 + LogTypeFnLangItem, // 23 + FailFnLangItem, // 24 + FailBoundsCheckFnLangItem, // 25 + ExchangeMallocFnLangItem, // 26 + ExchangeFreeFnLangItem, // 27 + MallocFnLangItem, // 28 + FreeFnLangItem, // 29 + BorrowAsImmFnLangItem, // 30 + BorrowAsMutFnLangItem, // 31 + ReturnToMutFnLangItem, // 32 + CheckNotBorrowedFnLangItem, // 33 + StrDupUniqFnLangItem, // 34 + RecordBorrowFnLangItem, // 35 + UnrecordBorrowFnLangItem, // 36 - StartFnLangItem, // 36 + StartFnLangItem, // 37 } pub struct LanguageItems { - items: [Option, ..37] + items: [Option, ..38] } pub impl LanguageItems { pub fn new() -> LanguageItems { LanguageItems { - items: [ None, ..37 ] + items: [ None, ..38 ] } } @@ -97,44 +98,45 @@ pub impl LanguageItems { 0 => "const", 1 => "copy", 2 => "owned", + 3 => "sized", - 3 => "drop", + 4 => "drop", - 4 => "add", - 5 => "sub", - 6 => "mul", - 7 => "div", - 8 => "rem", - 9 => "neg", - 10 => "not", - 11 => "bitxor", - 12 => "bitand", - 13 => "bitor", - 14 => "shl", - 15 => "shr", - 16 => "index", - 17 => "eq", - 18 => "ord", + 5 => "add", + 6 => "sub", + 7 => "mul", + 8 => "div", + 9 => "rem", + 10 => "neg", + 11 => "not", + 12 => "bitxor", + 13 => "bitand", + 14 => "bitor", + 15 => "shl", + 16 => "shr", + 17 => "index", + 18 => "eq", + 19 => "ord", - 19 => "str_eq", - 20 => "uniq_str_eq", - 21 => "annihilate", - 22 => "log_type", - 23 => "fail_", - 24 => "fail_bounds_check", - 25 => "exchange_malloc", - 26 => "exchange_free", - 27 => "malloc", - 28 => "free", - 29 => "borrow_as_imm", - 30 => "borrow_as_mut", - 31 => "return_to_mut", - 32 => "check_not_borrowed", - 33 => "strdup_uniq", - 34 => "record_borrow", - 35 => "unrecord_borrow", + 20 => "str_eq", + 21 => "uniq_str_eq", + 22 => "annihilate", + 23 => "log_type", + 24 => "fail_", + 25 => "fail_bounds_check", + 26 => "exchange_malloc", + 27 => "exchange_free", + 28 => "malloc", + 29 => "free", + 30 => "borrow_as_imm", + 31 => "borrow_as_mut", + 32 => "return_to_mut", + 33 => "check_not_borrowed", + 34 => "strdup_uniq", + 35 => "record_borrow", + 36 => "unrecord_borrow", - 36 => "start", + 37 => "start", _ => "???" } @@ -151,6 +153,9 @@ pub impl LanguageItems { pub fn owned_trait(&const self) -> def_id { self.items[OwnedTraitLangItem as uint].get() } + pub fn sized_trait(&const self) -> def_id { + self.items[SizedTraitLangItem as uint].get() + } pub fn drop_trait(&const self) -> def_id { self.items[DropTraitLangItem as uint].get() @@ -267,6 +272,7 @@ fn LanguageItemCollector(crate: @crate, item_refs.insert(@~"const", ConstTraitLangItem as uint); item_refs.insert(@~"copy", CopyTraitLangItem as uint); item_refs.insert(@~"owned", OwnedTraitLangItem as uint); + item_refs.insert(@~"sized", SizedTraitLangItem as uint); item_refs.insert(@~"drop", DropTraitLangItem as uint); diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index 8815259b3cc7..b0903f78db56 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -683,6 +683,7 @@ pub enum BuiltinBound { BoundStatic, BoundOwned, BoundConst, + BoundSized, } pub fn EmptyBuiltinBounds() -> BuiltinBounds { @@ -695,6 +696,7 @@ pub fn AllBuiltinBounds() -> BuiltinBounds { set.add(BoundStatic); set.add(BoundOwned); set.add(BoundConst); + set.add(BoundSized); set } @@ -1826,7 +1828,8 @@ pub impl TypeContents { BoundCopy => self.is_copy(cx), BoundStatic => self.is_static(cx), BoundConst => self.is_const(cx), - BoundOwned => self.is_owned(cx) + BoundOwned => self.is_owned(cx), + BoundSized => self.is_sized(cx), } } @@ -1871,6 +1874,14 @@ pub impl TypeContents { TC_MUTABLE } + fn is_sized(&self, cx: ctxt) -> bool { + !self.intersects(TypeContents::dynamically_sized(cx)) + } + + fn dynamically_sized(_cx: ctxt) -> TypeContents { + TC_DYNAMIC_SIZE + } + fn moves_by_default(&self, cx: ctxt) -> bool { self.intersects(TypeContents::nonimplicitly_copyable(cx)) } @@ -1944,8 +1955,11 @@ static TC_EMPTY_ENUM: TypeContents = TypeContents{bits: 0b0010_0000_0000}; /// Contains a type marked with `#[non_owned]` static TC_NON_OWNED: TypeContents = TypeContents{bits: 0b0100_0000_0000}; +/// Is a bare vector, str, function, trait, etc (only relevant at top level). +static TC_DYNAMIC_SIZE: TypeContents = TypeContents{bits: 0b1000_0000_0000}; + /// All possible contents. -static TC_ALL: TypeContents = TypeContents{bits: 0b0111_1111_1111}; +static TC_ALL: TypeContents = TypeContents{bits: 0b1111_1111_1111}; pub fn type_is_copyable(cx: ctxt, t: ty::t) -> bool { type_contents(cx, t).is_copy(cx) @@ -2029,7 +2043,7 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents { } ty_box(mt) => { - TC_MANAGED + nonowned(tc_mt(cx, mt, cache)) + TC_MANAGED + statically_sized(nonowned(tc_mt(cx, mt, cache))) } ty_trait(_, _, UniqTraitStore, _) => { @@ -2049,28 +2063,35 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents { ty_rptr(r, mt) => { borrowed_contents(r, mt.mutbl) + - nonowned(tc_mt(cx, mt, cache)) + statically_sized(nonowned(tc_mt(cx, mt, cache))) } ty_uniq(mt) => { - TC_OWNED_POINTER + tc_mt(cx, mt, cache) + TC_OWNED_POINTER + statically_sized(tc_mt(cx, mt, cache)) } ty_evec(mt, vstore_uniq) => { - TC_OWNED_VEC + tc_mt(cx, mt, cache) + TC_OWNED_VEC + statically_sized(tc_mt(cx, mt, cache)) } ty_evec(mt, vstore_box) => { - TC_MANAGED + nonowned(tc_mt(cx, mt, cache)) + TC_MANAGED + statically_sized(nonowned(tc_mt(cx, mt, cache))) } ty_evec(mt, vstore_slice(r)) => { borrowed_contents(r, mt.mutbl) + - nonowned(tc_mt(cx, mt, cache)) + statically_sized(nonowned(tc_mt(cx, mt, cache))) } ty_evec(mt, vstore_fixed(_)) => { - tc_mt(cx, mt, cache) + let contents = tc_mt(cx, mt, cache); + // FIXME(#6308) Uncomment this when construction of such + // vectors is prevented earlier in compilation. + // if !contents.is_sized(cx) { + // cx.sess.bug("Fixed-length vector of unsized type \ + // should be impossible"); + // } + contents } ty_estr(vstore_box) => { @@ -2145,7 +2166,7 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents { } ty_opaque_box => TC_MANAGED, - ty_unboxed_vec(mt) => tc_mt(cx, mt, cache), + ty_unboxed_vec(mt) => TC_DYNAMIC_SIZE + tc_mt(cx, mt, cache), ty_opaque_closure_ptr(sigil) => { match sigil { ast::BorrowedSigil => TC_BORROWED_POINTER, @@ -2212,6 +2233,14 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents { TypeContents {bits: pointee.bits & mask} } + fn statically_sized(pointee: TypeContents) -> TypeContents { + /*! + * If a dynamically-sized type is found behind a pointer, we should + * restore the 'Sized' kind to the pointer and things that contain it. + */ + TypeContents {bits: pointee.bits & !TC_DYNAMIC_SIZE.bits} + } + fn closure_contents(cty: &ClosureTy) -> TypeContents { let st = match cty.sigil { ast::BorrowedSigil => TC_BORROWED_POINTER, @@ -2240,6 +2269,8 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents { BoundStatic => TypeContents::nonstatic(cx), BoundOwned => TypeContents::nonowned(cx), BoundConst => TypeContents::nonconst(cx), + // The dynamic-size bit can be removed at pointer-level, etc. + BoundSized => TypeContents::dynamically_sized(cx), }; } @@ -2509,6 +2540,21 @@ pub fn type_is_enum(ty: t) -> bool { } } +// Is the type's representation size known at compile time? +pub fn type_is_sized(cx: ctxt, ty: ty::t) -> bool { + match get(ty).sty { + // FIXME(#6308) add trait, vec, str, etc here. + ty_param(p) => { + let param_def = cx.ty_param_defs.get(&p.def_id.node); + if param_def.bounds.builtin_bounds.contains_elem(BoundSized) { + return true; + } + return false; + }, + _ => return true, + } +} + // Whether a type is enum like, that is a enum type with only nullary // constructors pub fn type_is_c_like_enum(cx: ctxt, ty: t) -> bool { diff --git a/src/librustc/middle/typeck/astconv.rs b/src/librustc/middle/typeck/astconv.rs index 390ba2dc0de5..57e2a562b20f 100644 --- a/src/librustc/middle/typeck/astconv.rs +++ b/src/librustc/middle/typeck/astconv.rs @@ -782,6 +782,9 @@ pub fn try_add_builtin_trait(tcx: ty::ctxt, } else if trait_def_id == li.const_trait() { builtin_bounds.add(ty::BoundConst); true + } else if trait_def_id == li.sized_trait() { + builtin_bounds.add(ty::BoundSized); + true } else { false } diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs index 69e0f85522ab..5c5cc98bb9c3 100644 --- a/src/librustc/util/ppaux.rs +++ b/src/librustc/util/ppaux.rs @@ -563,6 +563,7 @@ impl Repr for ty::ParamBounds { ty::BoundStatic => ~"'static", ty::BoundOwned => ~"Owned", ty::BoundConst => ~"Const", + ty::BoundSized => ~"Sized", }); } for self.trait_bounds.each |t| { @@ -767,7 +768,8 @@ impl UserString for ty::BuiltinBound { ty::BoundCopy => ~"Copy", ty::BoundStatic => ~"'static", ty::BoundOwned => ~"Owned", - ty::BoundConst => ~"Const" + ty::BoundConst => ~"Const", + ty::BoundSized => ~"Sized", } } } diff --git a/src/libstd/kinds.rs b/src/libstd/kinds.rs index b6c22f29c3e5..05c963a32cc7 100644 --- a/src/libstd/kinds.rs +++ b/src/libstd/kinds.rs @@ -53,3 +53,8 @@ pub trait Owned { pub trait Const { // Empty. } + +#[lang="sized"] +pub trait Sized { + // Empty. +} diff --git a/src/libstd/prelude.rs b/src/libstd/prelude.rs index 07864ce419e6..4dcef60781f5 100644 --- a/src/libstd/prelude.rs +++ b/src/libstd/prelude.rs @@ -12,7 +12,7 @@ // Reexported core operators pub use either::{Either, Left, Right}; -pub use kinds::{Const, Copy, Owned}; +pub use kinds::{Const, Copy, Owned, Sized}; pub use ops::{Add, Sub, Mul, Div, Rem, Neg, Not}; pub use ops::{BitAnd, BitOr, BitXor}; pub use ops::{Drop}; From 32cd9b32749319578794521136e93f3261ca53ea Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 30 May 2013 21:39:46 -0400 Subject: [PATCH 2/3] Highlight Sized in vim and kate --- src/etc/kate/rust.xml | 1 + src/etc/vim/syntax/rust.vim | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/etc/kate/rust.xml b/src/etc/kate/rust.xml index 6a751bd1c858..44d0ce1a27fc 100644 --- a/src/etc/kate/rust.xml +++ b/src/etc/kate/rust.xml @@ -49,6 +49,7 @@ Copy Send Owned + Sized Eq Ord Num diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim index cd794df0a8d8..5c08fdfecca5 100644 --- a/src/etc/vim/syntax/rust.vim +++ b/src/etc/vim/syntax/rust.vim @@ -44,7 +44,7 @@ syn keyword rustType size_t ptrdiff_t clock_t time_t syn keyword rustType c_longlong c_ulonglong intptr_t uintptr_t syn keyword rustType off_t dev_t ino_t pid_t mode_t ssize_t -syn keyword rustTrait Const Copy Send Owned " inherent traits +syn keyword rustTrait Const Copy Send Owned Sized " inherent traits syn keyword rustTrait Eq Ord Num Ptr syn keyword rustTrait Drop Add Sub Mul Quot Rem Neg BitAnd BitOr syn keyword rustTrait BitXor Shl Shr Index From 5113f68a86594b189371756534117a60e1ce2be2 Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 30 May 2013 21:40:55 -0400 Subject: [PATCH 3/3] Add simple tests for Sized --- src/test/compile-fail/unsized-bare-typaram.rs | 14 ++++++++++++++ src/test/compile-fail/unsized-enum.rs | 14 ++++++++++++++ src/test/compile-fail/unsized-struct.rs | 17 +++++++++++++++++ src/test/run-pass/sized-borrowed-pointer | Bin 0 -> 12750 bytes src/test/run-pass/sized-borrowed-pointer.rs | 15 +++++++++++++++ src/test/run-pass/sized-owned-pointer | Bin 0 -> 12746 bytes src/test/run-pass/sized-owned-pointer.rs | 15 +++++++++++++++ 7 files changed, 75 insertions(+) create mode 100644 src/test/compile-fail/unsized-bare-typaram.rs create mode 100644 src/test/compile-fail/unsized-enum.rs create mode 100644 src/test/compile-fail/unsized-struct.rs create mode 100755 src/test/run-pass/sized-borrowed-pointer create mode 100644 src/test/run-pass/sized-borrowed-pointer.rs create mode 100755 src/test/run-pass/sized-owned-pointer create mode 100644 src/test/run-pass/sized-owned-pointer.rs diff --git a/src/test/compile-fail/unsized-bare-typaram.rs b/src/test/compile-fail/unsized-bare-typaram.rs new file mode 100644 index 000000000000..ff9d379c30f5 --- /dev/null +++ b/src/test/compile-fail/unsized-bare-typaram.rs @@ -0,0 +1,14 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// error-pattern: instantiating a type parameter with an incompatible type +fn bar() { } +fn foo() { bar::() } +fn main() { } diff --git a/src/test/compile-fail/unsized-enum.rs b/src/test/compile-fail/unsized-enum.rs new file mode 100644 index 000000000000..df7d82f0b259 --- /dev/null +++ b/src/test/compile-fail/unsized-enum.rs @@ -0,0 +1,14 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// error-pattern: instantiating a type parameter with an incompatible type +fn bar() { } +fn foo() { bar::>() } +fn main() { } diff --git a/src/test/compile-fail/unsized-struct.rs b/src/test/compile-fail/unsized-struct.rs new file mode 100644 index 000000000000..da3e9e124305 --- /dev/null +++ b/src/test/compile-fail/unsized-struct.rs @@ -0,0 +1,17 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// error-pattern: instantiating a type parameter with an incompatible type + +struct Foo { data: T } + +fn bar() { } +fn foo() { bar::>() } +fn main() { } diff --git a/src/test/run-pass/sized-borrowed-pointer b/src/test/run-pass/sized-borrowed-pointer new file mode 100755 index 0000000000000000000000000000000000000000..275622161d34f1ed28f2811d7f921fe1dea5fd66 GIT binary patch literal 12750 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Possibly-dynamic size of typaram should be cleared at pointer boundary. + +fn bar() { } +fn foo() { bar::<&T>() } +fn main() { } diff --git a/src/test/run-pass/sized-owned-pointer b/src/test/run-pass/sized-owned-pointer new file mode 100755 index 0000000000000000000000000000000000000000..3a290ba47ffb228dbaf66fb0a68f7f003a15967f GIT binary patch literal 12746 zcmb<-^>JfjWMqH=CI&kOFptXtECeAL7;Y$nxnRP9!GeK{!GS@JL7IV$fq{XQfq?<0 z&H>7T(FROlEetT41HxrsW?*1oVPIe=fXWvzK}>+rGEj9e8tf(p2C&;e_CcjlYzB#~ z;RBHj3^1C3K>;iP(hqWLfh?HIP#~KCX256(kb@W)7!05^OdrU3AblNBeH~DJFggLG zfPsMlM#KCE@*4>EK;?U&{)5pFSHWz7gayb!0Z&U(K>8GTK|BTq1zt$Fz-S+cFawMR zsRaoIJ}pTBxf8@D2E*JL1ho%WxJ-b$A4Y@15oCUYC`&4X28cx*hS{f|lbK{@qMwtZ zo0FMWTA^EEVWw+lqF0=+X9P|U0?;^i_X`CZ46+{NFOWD$K#+lfL70Jofs=uOfd?c2 zO@B}(m=a=OU;wED=>h5Gho&`duq-4EL4y}6f}pq%OgIbV1`r442X+Pq252$^34_xz zDA|DYg2D%6XU7KxMg|oZPLLSLE|7cNs_!!GdOWGd+4brhr^8mwJ8YViZxlwz?Ckx> z_v-R{KJ&?ZmS6+15Go9aw1O;cj6-}TBLf2{9FWz5*zP#gC*u&$#bM4DXc&XcM8+E! zu-jXQ!4Sz#z%604ff%V>MV@f}sOV{4v-){0tJ%`~r)s zTBv(2a6Dy$V>IkAVehKFpkbOd$XAG8k|}%y)rF8z(24rkIv#$1}uxmBk08 zre_wHq!u~nBo-H^7Bj?qhWN&(q!vMiLwucc^7B$d5|eULA#&JdqWsL0b5axYN(&4P z67%vhGct1$OHvKZ;YfVUUsx*HTnkToRv{lo?-^T2!2wpT`gn7D+BjEJ=;e zO)Q8nE=h?u&@+!Wa)~b}N{vSk3WoT!%)Cs7_{_Y_5{8`2B#`c+5>UW^I3R|eAxONS zB%>%bF$Gjc7=ZXGIUuGHh?xswnK6_WBq!$N#HXa@fC4i)8zzvKS`HP+$xKRysEv;Y zu|dK`CGok5nRyKHsVRvii45`aNyWtwafbNRyc7l%{~%9yPd|M)gBD=vd8PWrC5h>&hM=NNALNN-eVi(DGLx+IGxBp&^^=lvN^`-=ajPcL+|uGA z{ha*d#2g}Bf)QaQ`2{(tWvMw(32^AR`*=Dz#~bMx>6yZkHmp2^@EI8(5LB+hSP*tU zIFCV8l}crDGB7YPoP=tAArHy#pt2HFWX7L0VLsA!ATf{}Ok4p;98_k*#5It_L2iPH8z6}zm-!Y*;;^y?q{jhC98^bv#6Z}i`3;9h zH*2Yw0)t2EffCji$_xw)9?eHM4ufP7_`hk9m;%Fp)e$qw|o*!B_Sk zj2ApQk9l1DSIQK7co#^mN9&~$nEppl{SCGcMHLtrN(DnbI-kC%`~Uxc>@n7Jq6!R* zpAUoFi@vv4= zEnr|^D3|iw1!^FGEcV1Y0|o|$!yvl?UbBIsC-(5`9}|!Oihc=@76t|eB>f9u z`aPQ82zYeXegGRI5PR68yY>Uv{jc9688-pNJXqz2WL^N0c?uq2KY}dv=;pN&QDE@s z7S#q(owYwaI*)sFmVWT)Jm=Bv`op6$^aUuKyL~_Sbi2NI@%8Wj{~pap6k-qa%QJwy z=h6Je!lTnh#iO%Cg~OvWL`A@((?>g-7!N37^he9-YU0IFKfq@($Wg->@Vhv)x89-T)V|6lUxd=u~@`tSe$5g=<@ zK<;Mn=*&^M;nA!6M?itWr!z(6flsgM3lLlLsZVE)$_vNNzdoHMDjz%!{$=*;{N~eH zqw>SE^SVc8jLHR&n_q1H^Z&m`>)R3;!`q1C^zXBrzL%{$4{~Z_^7#{rp|Gxl~V;LA2L?Fg8FjfUIFjfdKO7pODOkiXe0EvV8 zIv_i=plU!ANE}3?s%KyTwFg1!FZ}-hAC#OK_ypYeB)s^!%Q+et?4_)=j8&9C`ao(x zZ4!>Z|NonS1k(5f+L)YqVPzahK81mSLF4cL{~&b?SmZ%57xDN1|3V!4moP9etoi%@ ze+fw5kx!zH8DYK-0|Ubm1_lO>fB*k?g5-VL*nE0ey?a@F`j|cXnLPO%n%S8=_(0(c zk_Pz~)V9p{_y0d6CP1R2cr*k?Ltr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1cp`! z9DvTNE`ZW7*F%Q~K*I-MAsF8P%79V~wonF?V(@@6pcF#{lmVp}lA#PJ#Q++U1z7-^ z69dtQp%T#PO$HbrHn#?w2La7tfz-q1KO{jM(EKfQK2#dYhxOy7p!^D`JZPK&Bm|QO z4M>9c8=&)|U;q8j2k||aA@eAp0ZI@*f)&DtjaN*7%EQKnuR;e2U~_x0AvsZyW+V(6 z5CwA;Amh$ZZ448@f{1Y$(0DOONE}2kFfiQUfY=WcuYmGl{(zVUnU4f%f!Y7>Kg2%~ zQ1$^KTQN z;SZCC(eBR9Rtg&Ksd**&`3fd_W_rd71%`TthB^ubnW?%4dZv0tnhQjFchos8c8D<4YEsPDKLDL(cJOk4Y zTlWB44*^^M08$IWu<`)J24T=-6Q~S;>4%jQ8=wN9aafQ#kQxvT%a1T~3>g?0zWx87 z4^_?pD_14%j&6QKG}Ks^j9mq1LIepvo@W?%rX z3xMf|m17Z52gAxOn0+8KU~CZW&A`9_Dl=gEVdaD#)FL&IA|&_2)WPTo1_lOD83gA; z%b5tMepvXUyB}&SLppTL1WZ4y+^c} z{h+!ADh$_O4P6HUav#V|uzDy1I;jS$UqEso46+ME!*Cgz{t3`>Y64V0c+4E87&L|t zWy7X~8qxGK!0Kyg#lr$k2T*McFnut7JDPr2y~zTtNTJSvDF?58fpZub7d`FI@T` zqUjHS>JNbGw}5Gc(lB>JxeU)ib2iX23?v4c#)Z%z61V#yvJ4Dwp!OTU1fX;W)PBh7 zE~p?>Er}0!cG7@H4>5M-U%|nHdD&>nCAiAexy$kO5Ynf%q`Y z%pe3`7YY*t(aa3O46yPC#D`&K1`!5WxdIad(aa2@46yP7#D`&K1~CR$IRFy_(aa3u z4DkF75`bc61_=gOzJ&^bDP{)Db!#9AW(M?H5i*a>!tn7wNFEu3(m4|YFT)3Dy#}5e zW?*0dl?#jvk_@nRI&!&y%^Wvy-o;0C3*Zc7@fL5`9%!XyttuS$@e?f8}ya&g+$J02(?}N?3Oovaw;vf@IF$*L1 z^^LNO*w=Gfg4H9^Gpt?)_4A=cABqJ@;5Am5=_DVtUXh8H;R|$KB1}^?NSpz4yx0)@!gvTe3924_y=XcP^%Y?CnEtH?tLJ3^t$PBQ4r<4O=oYXzmU65( zvnn-3H@`eDHAS}|AKa_dD@q2fr!)brpEERzH%>7#HaD|0Gf6TuO*J(#jyEuHg{`p5 zPXVozWQce7@pp3ciT8JN3w8~O4{>zzagAq)2QQ6;bOXUF5>W)e>oXbRT_XJ)eLbBS zKs`a|>P65R#CVj2nUFP)$;GA6C6`dWM65prcU>{oOgcCqFAGFp_la0Whe|&LC zN@iYsX>n=_zQwHZNM4JN&&@ANEiOq+&V~gccnN2Gh_7?JtDj4JJZ$YJVlilZd`fYC zd`4nk3TV+RA}GK;bab~D6I!!M#?o5kg{7n~vjxXIbcHKoK`V68DkzCTSI`0g`cf1` literal 0 HcmV?d00001 diff --git a/src/test/run-pass/sized-owned-pointer.rs b/src/test/run-pass/sized-owned-pointer.rs new file mode 100644 index 000000000000..fe9c63621b28 --- /dev/null +++ b/src/test/run-pass/sized-owned-pointer.rs @@ -0,0 +1,15 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Possibly-dynamic size of typaram should be cleared at pointer boundary. + +fn bar() { } +fn foo() { bar::<~T>() } +fn main() { }