diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-09-19 06:56:29 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-09-19 06:56:29 -0700 |
| commit | 53abb5edbd2079fdcc1c2887cf0a89aad75d6ea1 (patch) | |
| tree | 04e41a90d5260e20601552147ba076141c819f8f /src/rustc/middle | |
| parent | 8d4928f7808813de62fefcb89139bfb7382b250b (diff) | |
| download | rust-53abb5edbd2079fdcc1c2887cf0a89aad75d6ea1.tar.gz rust-53abb5edbd2079fdcc1c2887cf0a89aad75d6ea1.zip | |
use && for fn() even in legacy mode to work around mem leak
Diffstat (limited to 'src/rustc/middle')
| -rw-r--r-- | src/rustc/middle/ty.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index 7932474a698..78a5485ebae 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -1090,12 +1090,22 @@ pure fn mach_sty(cfg: @session::config, t: t) -> sty { } fn default_arg_mode_for_ty(tcx: ctxt, ty: ty::t) -> ast::rmode { - if ty::type_is_immediate(ty) { + return if ty::type_is_immediate(ty) { ast::by_val - } else if tcx.legacy_modes { + } else if tcx.legacy_modes || type_is_fn(ty) { + // ^^^^^^^^^^^^^^ + // FIXME(#2202) --- We retain by-ref by default to workaround a memory + // leak that otherwise results when @fn is upcast to &fn. ast::by_ref } else { ast::by_copy + }; + + fn type_is_fn(ty: t) -> bool { + match get(ty).sty { + ty_fn(*) => true, + _ => false + } } } |
