Skip to content

Commit 9294f8e

Browse files
committed
hash foreign items too
1 parent 28ce3e8 commit 9294f8e

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

src/librustc_incremental/calculate_svh.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use syntax::attr::AttributeMethods;
1515
use std::hash::{Hash, SipHasher, Hasher};
1616
use rustc::hir::def_id::{CRATE_DEF_INDEX, DefId};
17+
use rustc::hir::map::{NodeItem, NodeForeignItem};
1718
use rustc::hir::svh::Svh;
1819
use rustc::ty::TyCtxt;
1920
use rustc::hir::intravisit::{self, Visitor};
@@ -92,8 +93,12 @@ impl<'a, 'tcx> SvhCalculate for TyCtxt<'a, 'tcx, 'tcx> {
9293
intravisit::walk_crate(&mut visit, krate);
9394
} else {
9495
let node_id = self.map.as_local_node_id(def_id).unwrap();
95-
let item = self.map.expect_item(node_id);
96-
visit.visit_item(item);
96+
match self.map.find(node_id) {
97+
Some(NodeItem(item)) => visit.visit_item(item),
98+
Some(NodeForeignItem(item)) => visit.visit_foreign_item(item),
99+
r => bug!("calculate_item_hash: expected an item for node {} not {:?}",
100+
node_id, r),
101+
}
97102
}
98103
}
99104

src/test/incremental/foreign.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Test what happens we save incremental compilation state that makes
12+
// use of foreign items. This used to ICE (#34991).
13+
14+
// revisions: rpass1
15+
16+
#![feature(libc)]
17+
18+
extern crate libc;
19+
20+
use std::ffi::CString;
21+
22+
mod mlibc {
23+
use libc::{c_char, c_long, c_longlong};
24+
25+
extern {
26+
pub fn atol(x: *const c_char) -> c_long;
27+
pub fn atoll(x: *const c_char) -> c_longlong;
28+
}
29+
}
30+
31+
fn atol(s: String) -> isize {
32+
let c = CString::new(s).unwrap();
33+
unsafe { mlibc::atol(c.as_ptr()) as isize }
34+
}
35+
36+
fn atoll(s: String) -> i64 {
37+
let c = CString::new(s).unwrap();
38+
unsafe { mlibc::atoll(c.as_ptr()) as i64 }
39+
}
40+
41+
pub fn main() {
42+
assert_eq!(atol("1024".to_string()) * 10, atol("10240".to_string()));
43+
assert_eq!((atoll("11111111111111111".to_string()) * 10),
44+
atoll("111111111111111110".to_string()));
45+
}

0 commit comments

Comments
 (0)