summary refs log tree commit diff
path: root/src/rustc/middle
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-09-19 06:56:29 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-09-19 06:56:29 -0700
commit53abb5edbd2079fdcc1c2887cf0a89aad75d6ea1 (patch)
tree04e41a90d5260e20601552147ba076141c819f8f /src/rustc/middle
parent8d4928f7808813de62fefcb89139bfb7382b250b (diff)
downloadrust-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.rs14
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
+        }
     }
 }