Skip to content

Commit cc689d2

Browse files
committed
---
yaml --- r: 7643 b: refs/heads/master c: 6db688e h: refs/heads/master i: 7641: ab0697e 7639: 1582742 v: v3
1 parent 0227ba0 commit cc689d2

File tree

6 files changed

+109
-3
lines changed

6 files changed

+109
-3
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 9dc59e15061827122dc0f08d3f66acd17ba329dc
2+
refs/heads/master: 6db688e893f69632624fb8d2e3b747a3b81000b0

trunk/src/comp/middle/resolve.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,32 @@ fn check_exports(e: @env) {
17661766
}
17671767
}
17681768

1769+
fn check_enum_ok(e: @env, sp:span, id: ident, val: @indexed_mod)
1770+
-> node_id {
1771+
alt val.index.find(id) {
1772+
none { e.sess.span_fatal(sp, #fmt("error: undefined id %s\
1773+
in an export", id)); }
1774+
some(ms) {
1775+
let maybe_id = list::find(ms) {|m|
1776+
alt m {
1777+
mie_item(an_item) {
1778+
alt an_item.node {
1779+
item_tag(_,_) { /* OK */ some(an_item.id) }
1780+
_ { none }
1781+
}
1782+
}
1783+
_ { none }
1784+
}
1785+
};
1786+
alt maybe_id {
1787+
some(an_id) { ret an_id; }
1788+
_ { e.sess.span_fatal(sp, #fmt("error: %s does not refer \
1789+
to an enumeration", id)); }
1790+
}
1791+
}
1792+
}
1793+
}
1794+
17691795
e.mod_map.values {|val|
17701796
alt val.m {
17711797
some(m) {
@@ -1776,14 +1802,44 @@ fn check_exports(e: @env) {
17761802
check_export(e, ident, val, vi);
17771803
}
17781804
}
1805+
ast::view_item_export_tag_none(id, _) {
1806+
let _ = check_enum_ok(e, vi.span, id, val);
1807+
}
1808+
ast::view_item_export_tag_some(id, ids, _) {
1809+
// Check that it's an enum and all the given variants
1810+
// belong to it
1811+
let parent_id = check_enum_ok(e, vi.span, id, val);
1812+
for variant_id in ids {
1813+
alt val.index.find(variant_id.node.name) {
1814+
some(ms) {
1815+
list::iter(ms) {|m|
1816+
alt m {
1817+
mie_tag_variant(parent_item,_) {
1818+
if parent_item.id != parent_id {
1819+
e.sess.span_err(vi.span,
1820+
#fmt("variant %s \
1821+
doesn't belong to enum %s",
1822+
variant_id.node.name,
1823+
id));
1824+
}
1825+
}
1826+
_ { e.sess.span_err(vi.span,
1827+
#fmt("%s is not a \
1828+
variant", variant_id.node.name)); }
1829+
}}
1830+
}
1831+
_ { e.sess.span_err(vi.span, #fmt("%s is not a\
1832+
variant", variant_id.node.name)); }
1833+
}
1834+
}
1835+
}
17791836
_ { }
17801837
}
17811838
}
17821839
}
17831840
none { }
17841841
}
1785-
};
1786-
}
1842+
}}
17871843

17881844
// Impl resolution
17891845

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// error-pattern:b does not refer to an enumeration
2+
import bad::*;
3+
4+
mod bad {
5+
export b::{};
6+
7+
fn b() { fail; }
8+
}
9+
10+
fn main() {
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// error-pattern:b does not refer to an enumeration
2+
import bad::*;
3+
4+
mod bad {
5+
export b::{f, z};
6+
7+
fn b() { fail; }
8+
fn f() { fail; }
9+
fn z() { fail; }
10+
}
11+
12+
fn main() {
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// error-pattern:f is not a variant
2+
import bad::*;
3+
4+
mod bad {
5+
export b::{f, z};
6+
7+
enum b { z, k }
8+
fn f() { fail; }
9+
}
10+
11+
fn main() {
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// error-pattern:variant e doesn't belong to enum floop
2+
import bad::*;
3+
4+
mod bad {
5+
6+
export floop::{a, e};
7+
8+
enum floop {a, b, c}
9+
enum bloop {d, e, f}
10+
11+
}
12+
13+
fn main() {
14+
}

0 commit comments

Comments
 (0)