about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-01-25 18:15:19 -0500
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-01-25 18:16:52 -0500
commit1b82060c5e40e0b4e996bcd30deccd2a523c7590 (patch)
tree13eb7356df6235fb560be3a8e5d5310c71b774d4
parent9e2324ad1e3f2abf528fbbbdafe2cb8a18c3151d (diff)
downloadrust-1b82060c5e40e0b4e996bcd30deccd2a523c7590.tar.gz
rust-1b82060c5e40e0b4e996bcd30deccd2a523c7590.zip
Print an error if we try to refer to a module in an expr_path.
-rw-r--r--src/Makefile1
-rw-r--r--src/comp/middle/resolve.rs12
-rw-r--r--src/test/compile-fail/bad-expr-path2.rs10
3 files changed, 22 insertions, 1 deletions
diff --git a/src/Makefile b/src/Makefile
index 5da271704e4..8ad5c4bccf9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -504,6 +504,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
                         arg-count-mismatch.rs \
                         arg-type-mismatch.rs \
                         bad-expr-path.rs \
+                        bad-expr-path2.rs \
                         import.rs \
                         import2.rs \
                         import3.rs \
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index 1f609dd51f9..f372e3d73f6 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -444,7 +444,17 @@ fn fold_expr_path(&env e, &span sp, &ast.path p, &option.t[def] d,
     // the expr_field(expr_field(...(expr_path(...)))) we should return.
 
     auto index = new_def_hash[def_wrap]();
-    find_final_def(e, index, sp, p.node.idents, none[ast.def_id]);
+    auto d = find_final_def(e, index, sp, p.node.idents, none[ast.def_id]);
+    alt (d) {
+        case (def_wrap_expr_field(_)) {
+        }
+        case (def_wrap_other(_)) {
+        }
+        case (def_wrap_mod(?m)) {
+            e.sess.span_err(sp,
+                            "can't refer to a module as a first-class value");
+        }
+    }
 
     auto p_ = rec(node=rec(idents = vec(id0) with p.node) with p);
     auto ex = @fold.respan[ast.expr_](sp, ast.expr_path(p_, d_, a));
diff --git a/src/test/compile-fail/bad-expr-path2.rs b/src/test/compile-fail/bad-expr-path2.rs
new file mode 100644
index 00000000000..a2f58f8ede1
--- /dev/null
+++ b/src/test/compile-fail/bad-expr-path2.rs
@@ -0,0 +1,10 @@
+// error-pattern: can't refer to a module as a first-class value
+
+mod m1 {
+  mod a {
+  }
+}
+
+fn main(vec[str] args) {
+  log m1.a;
+}