diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2016-07-28 20:58:32 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2016-08-01 19:57:32 -0400 |
| commit | 9294f8ed0a053af18be8247ef589bc16775bd038 (patch) | |
| tree | 9317c24bab306bcdf0a4b76b41950a2f62e31790 | |
| parent | 28ce3e8a55b21a285f7075612d140a44b42eb889 (diff) | |
| download | rust-9294f8ed0a053af18be8247ef589bc16775bd038.tar.gz rust-9294f8ed0a053af18be8247ef589bc16775bd038.zip | |
hash foreign items too
| -rw-r--r-- | src/librustc_incremental/calculate_svh.rs | 9 | ||||
| -rw-r--r-- | src/test/incremental/foreign.rs | 45 |
2 files changed, 52 insertions, 2 deletions
diff --git a/src/librustc_incremental/calculate_svh.rs b/src/librustc_incremental/calculate_svh.rs index bea6b7e2834..af579fa10fb 100644 --- a/src/librustc_incremental/calculate_svh.rs +++ b/src/librustc_incremental/calculate_svh.rs @@ -14,6 +14,7 @@ use syntax::attr::AttributeMethods; use std::hash::{Hash, SipHasher, Hasher}; use rustc::hir::def_id::{CRATE_DEF_INDEX, DefId}; +use rustc::hir::map::{NodeItem, NodeForeignItem}; use rustc::hir::svh::Svh; use rustc::ty::TyCtxt; use rustc::hir::intravisit::{self, Visitor}; @@ -92,8 +93,12 @@ impl<'a, 'tcx> SvhCalculate for TyCtxt<'a, 'tcx, 'tcx> { intravisit::walk_crate(&mut visit, krate); } else { let node_id = self.map.as_local_node_id(def_id).unwrap(); - let item = self.map.expect_item(node_id); - visit.visit_item(item); + match self.map.find(node_id) { + Some(NodeItem(item)) => visit.visit_item(item), + Some(NodeForeignItem(item)) => visit.visit_foreign_item(item), + r => bug!("calculate_item_hash: expected an item for node {} not {:?}", + node_id, r), + } } } diff --git a/src/test/incremental/foreign.rs b/src/test/incremental/foreign.rs new file mode 100644 index 00000000000..dbdebefaf31 --- /dev/null +++ b/src/test/incremental/foreign.rs @@ -0,0 +1,45 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test what happens we save incremental compilation state that makes +// use of foreign items. This used to ICE (#34991). + +// revisions: rpass1 + +#![feature(libc)] + +extern crate libc; + +use std::ffi::CString; + +mod mlibc { + use libc::{c_char, c_long, c_longlong}; + + extern { + pub fn atol(x: *const c_char) -> c_long; + pub fn atoll(x: *const c_char) -> c_longlong; + } +} + +fn atol(s: String) -> isize { + let c = CString::new(s).unwrap(); + unsafe { mlibc::atol(c.as_ptr()) as isize } +} + +fn atoll(s: String) -> i64 { + let c = CString::new(s).unwrap(); + unsafe { mlibc::atoll(c.as_ptr()) as i64 } +} + +pub fn main() { + assert_eq!(atol("1024".to_string()) * 10, atol("10240".to_string())); + assert_eq!((atoll("11111111111111111".to_string()) * 10), + atoll("111111111111111110".to_string())); +} |
