diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 744ff4d7ce6c..cba884c04b35 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -2274,6 +2274,31 @@ fn make_free_glue(&@block_ctxt cx, ValueRef v0, &ty::t t) { rslt.bcx.build.RetVoid(); } +fn maybe_free_ivec_heap_part(&@block_ctxt cx, ValueRef v0, ty::t unit_ty) + -> result { + auto llunitty = type_of_or_i8(cx, unit_ty); + + auto stack_len = cx.build.Load(cx.build.InBoundsGEP(v0, [C_int(0), + C_uint(abi::ivec_elt_len)])); + auto maybe_on_heap_cx = new_sub_block_ctxt(cx, "maybe_on_heap"); + auto next_cx = new_sub_block_ctxt(cx, "next"); + auto maybe_on_heap = cx.build.ICmp(lib::llvm::LLVMIntEQ, stack_len, + C_int(0)); + cx.build.CondBr(maybe_on_heap, maybe_on_heap_cx.llbb, next_cx.llbb); + + // Might be on the heap. Load the heap pointer and free it. (It's ok to + // free a null pointer.) + auto stub_ptr = maybe_on_heap_cx.build.PointerCast(v0, + T_ptr(T_ivec_heap(llunitty))); + auto heap_ptr = maybe_on_heap_cx.build.Load( + maybe_on_heap_cx.build.InBoundsGEP(stub_ptr, + [C_int(0), C_uint(abi::ivec_heap_stub_elt_ptr)])); + auto after_free_cx = trans_non_gc_free(maybe_on_heap_cx, heap_ptr).bcx; + after_free_cx.build.Br(next_cx.llbb); + + ret res(next_cx, C_nil()); +} + fn make_drop_glue(&@block_ctxt cx, ValueRef v0, &ty::t t) { // NB: v0 is an *alias* of type t here, not a direct value. auto rslt; @@ -2286,6 +2311,11 @@ fn make_drop_glue(&@block_ctxt cx, ValueRef v0, &ty::t t) { rslt = decr_refcnt_maybe_free(cx, v0, v0, t); } + case (ty::ty_ivec(?tm)) { + rslt = iter_structural_ty(cx, v0, t, drop_ty); + rslt = maybe_free_ivec_heap_part(rslt.bcx, v0, tm.ty); + } + case (ty::ty_box(_)) { rslt = decr_refcnt_maybe_free(cx, v0, v0, t); } @@ -5885,7 +5915,7 @@ fn trans_ivec(@block_ctxt bcx, &vec[@ast::expr] args, &ast::ann ann) llfirsteltptr = C_null(T_ptr(llunitty)); } else { auto llheapsz = bcx.build.Add(llsize_of(llheapty), lllen); - rslt = trans_raw_malloc(bcx, llheapty, llheapsz); + rslt = trans_raw_malloc(bcx, T_ptr(llheapty), llheapsz); bcx = rslt.bcx; auto llheapptr = rslt.val; diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 2a879bbfd578..6a7d305fa237 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -527,7 +527,17 @@ mod collect { fn ty_of_arg(@ctxt cx, &ast::arg a) -> ty::arg { auto ty_mode = ast_mode_to_mode(a.mode); auto f = bind getter(cx, _); - ret rec(mode=ty_mode, ty=ast_ty_to_ty(cx.tcx, f, a.ty)); + auto tt = ast_ty_to_ty(cx.tcx, f, a.ty); + if (ty::type_has_dynamic_size(cx.tcx, tt)) { + alt (ty_mode) { + case (mo_val) { + cx.tcx.sess.span_err(a.ty.span, + "Dynamically sized arguments must be passed by alias"); + } + case (_) { } + } + } + ret rec(mode=ty_mode, ty=tt); } fn ty_of_method(@ctxt cx, &@ast::method m) -> ty::method { diff --git a/src/test/compile-fail/aliasness-mismatch.rs b/src/test/compile-fail/aliasness-mismatch.rs index 88b7d9385c3a..b4f156c76347 100644 --- a/src/test/compile-fail/aliasness-mismatch.rs +++ b/src/test/compile-fail/aliasness-mismatch.rs @@ -1,6 +1,4 @@ // -*- rust -*- -// xfail-stage0 - // error-pattern: mismatched types fn f(&int x) { log_err x; } diff --git a/src/test/compile-fail/bad-bang-ann-2.rs b/src/test/compile-fail/bad-bang-ann-2.rs index c2b156bd8c9c..b3264ab33331 100644 --- a/src/test/compile-fail/bad-bang-ann-2.rs +++ b/src/test/compile-fail/bad-bang-ann-2.rs @@ -1,5 +1,4 @@ // -*- rust -*- -// xfail-stage0 // Tests that a function with a ! annotation always actually fails // error-pattern: some control paths may return diff --git a/src/test/compile-fail/bad-bang-ann-3.rs b/src/test/compile-fail/bad-bang-ann-3.rs index 7538fffa569e..b0701321272b 100644 --- a/src/test/compile-fail/bad-bang-ann-3.rs +++ b/src/test/compile-fail/bad-bang-ann-3.rs @@ -1,5 +1,4 @@ // -*- rust -*- -// xfail-stage0 // Tests that a function with a ! annotation always actually fails // error-pattern: some control paths may return diff --git a/src/test/compile-fail/bad-bang-ann.rs b/src/test/compile-fail/bad-bang-ann.rs index 0b9c3a19cd2f..77c6a4127697 100644 --- a/src/test/compile-fail/bad-bang-ann.rs +++ b/src/test/compile-fail/bad-bang-ann.rs @@ -1,5 +1,4 @@ // -*- rust -*- -// xfail-stage0 // Tests that a function with a ! annotation always actually fails // error-pattern: may return to the caller diff --git a/src/test/compile-fail/bad-expr-path2.rs b/src/test/compile-fail/bad-expr-path2.rs index 32d655d8485d..e8123f24d5ca 100644 --- a/src/test/compile-fail/bad-expr-path2.rs +++ b/src/test/compile-fail/bad-expr-path2.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: unresolved name: a mod m1 { diff --git a/src/test/compile-fail/bad-module.rs b/src/test/compile-fail/bad-module.rs index 76ba22dcbf9f..111d118a0ee0 100644 --- a/src/test/compile-fail/bad-module.rs +++ b/src/test/compile-fail/bad-module.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: unresolved import: vec import vec; diff --git a/src/test/compile-fail/bad-name.rs b/src/test/compile-fail/bad-name.rs index 94de7958376a..a53b8284d59e 100644 --- a/src/test/compile-fail/bad-name.rs +++ b/src/test/compile-fail/bad-name.rs @@ -1,7 +1,3 @@ -// xfail-stage0 -// xfail-stage1 -// xfail-stage2 - // error-pattern: expecting fn main() { diff --git a/src/test/compile-fail/constructor-as-cast.rs b/src/test/compile-fail/constructor-as-cast.rs index 53d115c788d4..ccc58f1849e8 100644 --- a/src/test/compile-fail/constructor-as-cast.rs +++ b/src/test/compile-fail/constructor-as-cast.rs @@ -1,7 +1,4 @@ -// xfail-stage0 -// xfail-stage1 -// xfail-stage2 -// error-pattern: non-type context +// error-pattern: unresolved name: base type base = obj { fn foo(); diff --git a/src/test/compile-fail/direct-obj-fn-call.rs b/src/test/compile-fail/direct-obj-fn-call.rs index 0ffa2887304d..3dd8fe0b62b3 100644 --- a/src/test/compile-fail/direct-obj-fn-call.rs +++ b/src/test/compile-fail/direct-obj-fn-call.rs @@ -1,8 +1,4 @@ -// xfail-stage0 -// xfail-stage1 -// xfail-stage2 - -// error-pattern: is not a mod +// error-pattern: base type for expr_field obj x() { fn hello() { diff --git a/src/test/compile-fail/does-nothing.rs b/src/test/compile-fail/does-nothing.rs index e1a74d36c426..ef7115de02a9 100644 --- a/src/test/compile-fail/does-nothing.rs +++ b/src/test/compile-fail/does-nothing.rs @@ -1,7 +1,4 @@ -// xfail-stage0 -// xfail-stage1 -// xfail-stage2 -// error-pattern: does nothing +// error-pattern: unresolved name: this_does_nothing_what_the fn main() { log "doing"; this_does_nothing_what_the; diff --git a/src/test/compile-fail/duplicate-name.rs b/src/test/compile-fail/duplicate-name.rs index 7baad6b373f6..c7650aa071c8 100644 --- a/src/test/compile-fail/duplicate-name.rs +++ b/src/test/compile-fail/duplicate-name.rs @@ -1,5 +1,3 @@ -// xfail-stage0 - // error-pattern: duplicate value name: x fn main() { diff --git a/src/test/compile-fail/export-import.rs b/src/test/compile-fail/export-import.rs index ad68253360f1..dce1fb02d1c6 100644 --- a/src/test/compile-fail/export-import.rs +++ b/src/test/compile-fail/export-import.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: unresolved import import m::unexported; diff --git a/src/test/compile-fail/extfmt-no-args.rs b/src/test/compile-fail/extfmt-no-args.rs index d31939ead1b2..b3bdf231c9e1 100644 --- a/src/test/compile-fail/extfmt-no-args.rs +++ b/src/test/compile-fail/extfmt-no-args.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern:format string fn main() { diff --git a/src/test/compile-fail/for-loop-decl.rs b/src/test/compile-fail/for-loop-decl.rs index 00da58e17450..2dc8cacc4b2f 100644 --- a/src/test/compile-fail/for-loop-decl.rs +++ b/src/test/compile-fail/for-loop-decl.rs @@ -12,7 +12,7 @@ fn bitv_to_str(fn_info enclosing, bitv::t v) -> str { // error is that the value type in the hash map is var_info, not a tuple for each (@tup(uint, tup(uint, uint)) p in enclosing.vars.items()) { if (bitv::get(v, p._1._0)) { - s += "foo"; // " " + p._1._1 + " " + "[" + p._0 + "]"; + s += "foo"; } } ret s; diff --git a/src/test/compile-fail/import.rs b/src/test/compile-fail/import.rs index da2b587fb715..66c706c1cc1a 100644 --- a/src/test/compile-fail/import.rs +++ b/src/test/compile-fail/import.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: unresolved import: baz import zed::bar; import zed::baz; diff --git a/src/test/compile-fail/import3.rs b/src/test/compile-fail/import3.rs index ceda5e25b45c..bdad6876e8a9 100644 --- a/src/test/compile-fail/import3.rs +++ b/src/test/compile-fail/import3.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: unresolved modulename import main::bar; diff --git a/src/test/compile-fail/infinite-vec-type-recursion.rs b/src/test/compile-fail/infinite-vec-type-recursion.rs index 9a2cd3237ba3..418fdb396a8f 100644 --- a/src/test/compile-fail/infinite-vec-type-recursion.rs +++ b/src/test/compile-fail/infinite-vec-type-recursion.rs @@ -1,9 +1,6 @@ -// xfail-stage0 -// xfail-stage1 -// xfail-stage2 // -*- rust -*- - -// error-pattern: infinite recursive type definition +// xfail-stage0 +// error-pattern: illegal recursive type type x = vec[x]; diff --git a/src/test/compile-fail/item-name-overload.rs b/src/test/compile-fail/item-name-overload.rs index 8b99dbbdf969..759747e10089 100644 --- a/src/test/compile-fail/item-name-overload.rs +++ b/src/test/compile-fail/item-name-overload.rs @@ -1,9 +1,6 @@ -// xfail-stage0 -// xfail-stage1 -// xfail-stage2 // -*- rust -*- - -// error-pattern: name +// xfail-stage0 +// error-pattern: Dynamically sized arguments must be passed by alias mod foo { fn bar[T](T f) -> int { ret 17; } diff --git a/src/test/compile-fail/missing-return.rs b/src/test/compile-fail/missing-return.rs index 4c73a4fd4c9b..34fb4105b8e0 100644 --- a/src/test/compile-fail/missing-return.rs +++ b/src/test/compile-fail/missing-return.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: return fn f() -> int { diff --git a/src/test/compile-fail/missing-return2.rs b/src/test/compile-fail/missing-return2.rs index 8baa6a3ac18b..2788f4c16fc0 100644 --- a/src/test/compile-fail/missing-return2.rs +++ b/src/test/compile-fail/missing-return2.rs @@ -1,4 +1,3 @@ -// xfail-stage0 // error-pattern: return fn f() -> int { diff --git a/src/test/compile-fail/vector-no-ann.rs b/src/test/compile-fail/vector-no-ann.rs index b492f103c203..cc61922f63ae 100644 --- a/src/test/compile-fail/vector-no-ann.rs +++ b/src/test/compile-fail/vector-no-ann.rs @@ -1,5 +1,3 @@ -// xfail-stage0 - // error-pattern:cannot determine a type fn main() -> () { auto foo = [];