@@ -153,6 +153,7 @@ fn resolve_crate(sess: session, amap: &ast_map::map, crate: @ast::crate) ->
153
153
map_crate ( e, crate ) ;
154
154
resolve_imports ( * e) ;
155
155
check_for_collisions ( e, * crate ) ;
156
+ check_bad_exports ( e) ;
156
157
resolve_names ( e, crate ) ;
157
158
ret { def_map : e. def_map , ext_map : e. ext_map } ;
158
159
}
@@ -960,9 +961,7 @@ fn lookup_in_local_mod(e: &env, node_id: node_id, sp: &span, id: &ident,
960
961
let info = e. mod_map . get ( node_id) ;
961
962
if dr == outside && !ast_util:: is_exported ( id, option:: get ( info. m ) ) {
962
963
// if we're in a native mod, then dr==inside, so info.m is some _mod
963
-
964
964
ret none :: < def > ; // name is not visible
965
-
966
965
}
967
966
alt info. index . find ( id) {
968
967
none. { }
@@ -1430,6 +1429,40 @@ fn ensure_unique<T>(e: &env, sp: &span, elts: &[T], id: fn(&T) -> ident,
1430
1429
for elt: T in elts { add_name(ch, sp, id(elt)); }
1431
1430
}
1432
1431
1432
+ fn check_bad_exports(e: &@env) {
1433
+ fn lookup_glob_any(e: &env, info: &@indexed_mod, sp: &span,
1434
+ ident: &ident) -> bool {
1435
+ ret !option::is_none(lookup_glob_in_mod(e, info, sp, ident,
1436
+ ns_module, inside)) ||
1437
+ !option::is_none(lookup_glob_in_mod(e, info, sp, ident,
1438
+ ns_value, inside)) ||
1439
+ !option::is_none(lookup_glob_in_mod(e, info, sp, ident,
1440
+ ns_type, inside));
1441
+ }
1442
+
1443
+ for each @{val, _} in e.mod_map.items() {
1444
+ alt val.m {
1445
+ some(m) {
1446
+ for vi in m.view_items {
1447
+ alt vi.node {
1448
+ ast::view_item_export(idents, _) {
1449
+ for ident in idents {
1450
+ if !val.index.contains_key(ident) &&
1451
+ !lookup_glob_any(*e, val, vi.span, ident) {
1452
+ e.sess.span_warn(vi.span, ~"exported item " +
1453
+ ident + ~" is not defined" ) ;
1454
+ }
1455
+ }
1456
+ }
1457
+ _ { }
1458
+ }
1459
+ }
1460
+ }
1461
+ none. { }
1462
+ }
1463
+ }
1464
+ }
1465
+
1433
1466
// Local Variables:
1434
1467
// mode: rust
1435
1468
// fill-column: 78;
0 commit comments