diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2011-07-12 13:42:05 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2011-07-12 13:42:05 -0700 |
| commit | f7a1006a07b396ed239c08d3576597dad103e064 (patch) | |
| tree | 73f59d632accd4c54d41072946ab067b7c8e996e /src/comp | |
| parent | 0d9c08af2a821c50d412f0b3a93bf2c08cd9bf0e (diff) | |
| download | rust-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.rs | 23 |
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; } } |
