about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2011-07-12 13:42:05 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2011-07-12 13:42:05 -0700
commitf7a1006a07b396ed239c08d3576597dad103e064 (patch)
tree73f59d632accd4c54d41072946ab067b7c8e996e /src/comp
parent0d9c08af2a821c50d412f0b3a93bf2c08cd9bf0e (diff)
downloadrust-f7a1006a07b396ed239c08d3576597dad103e064.tar.gz
rust-f7a1006a07b396ed239c08d3576597dad103e064.zip
Make resolve check for type-variable name-shadowing
Capturing a type argument in the enclosing scope should be an error --
this commit implements that check in resolve, avoiding a potential
assertion failure in trans.

Closes #648.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/resolve.rs23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index 6fb22c34d19..080d9270f6a 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -596,6 +596,10 @@ fn def_is_obj_field(&def d) -> bool {
     ret alt (d) { case (ast::def_obj_field(_)) { true } case (_) { false } };
 }
 
+fn def_is_ty_arg(&def d) -> bool {
+    ret alt(d) { case (ast::def_ty_arg(_)) { true } case (_) { false } };
+}
+
 fn lookup_in_scope(&env e, scopes sc, &span sp, &ident name, namespace ns) ->
    option::t[def] {
     fn in_scope(&env e, &span sp, &ident name, &scope s, namespace ns) ->
@@ -666,15 +670,24 @@ fn lookup_in_scope(&env e, scopes sc, &span sp, &ident name, namespace ns) ->
                 if (!option::is_none(fnd)) {
                     auto df = option::get(fnd);
                     if (left_fn && def_is_local(df) ||
-                            left_fn_level2 && def_is_obj_field(df)) {
-                        e.sess.span_fatal(sp,
-                                        "attempted dynamic \
-                                         environment-capture");
+                        left_fn_level2 && def_is_obj_field(df)
+                        || (scope_is_fn(hd) && left_fn
+                            && def_is_ty_arg(df))) {
+                        auto msg = alt (ns) {
+                            case (ns_type) {
+                                "Attempt to use a type \
+                                argument out of scope"
+                            }
+                            case (_) { "attempted dynamic \
+                                       environment-capture" }
+                        };
+                        e.sess.span_fatal(sp, msg);
                     }
                     ret fnd;
                 }
                 if (left_fn) { left_fn_level2 = true; }
-                if (ns == ns_value && !left_fn) { left_fn = scope_is_fn(hd); }
+                if ((ns == ns_value || ns == ns_type) && !left_fn) {
+                    left_fn = scope_is_fn(hd); }
                 sc = *tl;
             }
         }