diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 93feef58307..649d5f592c5 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -157,6 +157,7 @@ pub struct Cache {
priv parent_stack: ~[ast::NodeId],
priv search_index: ~[IndexItem],
priv privmod: bool,
+ priv public_items: HashSet,
}
/// Helper struct to render all source code to HTML pages
@@ -231,18 +232,23 @@ pub fn run(mut krate: clean::Crate, dst: Path) -> io::IoResult<()> {
}
// Crawl the crate to build various caches used for the output
- let mut cache = Cache {
- impls: HashMap::new(),
- typarams: HashMap::new(),
- paths: HashMap::new(),
- traits: HashMap::new(),
- implementors: HashMap::new(),
- stack: ~[],
- parent_stack: ~[],
- search_index: ~[],
- extern_locations: HashMap::new(),
- privmod: false,
- };
+ let mut cache = local_data::get(::analysiskey, |analysis| {
+ let public_items = analysis.map(|a| a.public_items.clone());
+ let public_items = public_items.unwrap_or(HashSet::new());
+ Cache {
+ impls: HashMap::new(),
+ typarams: HashMap::new(),
+ paths: HashMap::new(),
+ traits: HashMap::new(),
+ implementors: HashMap::new(),
+ stack: ~[],
+ parent_stack: ~[],
+ search_index: ~[],
+ extern_locations: HashMap::new(),
+ privmod: false,
+ public_items: public_items,
+ }
+ });
cache.stack.push(krate.name.clone());
krate = cache.fold_crate(krate);
@@ -566,7 +572,16 @@ impl DocFolder for Cache {
clean::TypedefItem(..) | clean::TraitItem(..) |
clean::FunctionItem(..) | clean::ModuleItem(..) |
clean::ForeignFunctionItem(..) => {
- self.paths.insert(item.id, (self.stack.clone(), shortty(&item)));
+ // Reexported items mean that the same id can show up twice in
+ // the rustdoc ast that we're looking at. We know, however, that
+ // a reexported item doesn't show up in the `public_items` map,
+ // so we can skip inserting into the paths map if there was
+ // already an entry present and we're not a public item.
+ if !self.paths.contains_key(&item.id) ||
+ self.public_items.contains(&item.id) {
+ self.paths.insert(item.id,
+ (self.stack.clone(), shortty(&item)));
+ }
}
// link variants to their parent enum because pages aren't emitted
// for each variant
diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs
index 49cf10c47cb..34b33003786 100644
--- a/src/libstd/macros.rs
+++ b/src/libstd/macros.rs
@@ -130,6 +130,7 @@ macro_rules! log_enabled(
/// # Example
///
/// ```should_fail
+/// # #[allow(unreachable_code)];
/// fail!();
/// fail!("this is a terrible mistake!");
/// fail!(4); // fail with the value of 4 to be collected elsewhere
@@ -228,13 +229,15 @@ macro_rules! assert_eq(
/// # Example
///
/// ~~~rust
+/// struct Item { weight: uint }
+///
/// fn choose_weighted_item(v: &[Item]) -> Item {
/// assert!(!v.is_empty());
/// let mut so_far = 0u;
/// for item in v.iter() {
/// so_far += item.weight;
/// if so_far > 100 {
-/// return item;
+/// return *item;
/// }
/// }
/// // The above loop always returns, so we must hint to the
@@ -336,7 +339,7 @@ macro_rules! println(
/// local_data_key!(my_integer: int)
///
/// local_data::set(my_integer, 2);
-/// local_data::get(my_integer, |val| println!("{}", val));
+/// local_data::get(my_integer, |val| println!("{}", val.map(|i| *i)));
/// ```
#[macro_export]
macro_rules! local_data_key(