Skip to content

Commit

Permalink
auto merge of #18279 : bgamari/rust/check-static-recursion, r=alexcri…
Browse files Browse the repository at this point in the history
…chton

I just found this patch which at some point solved a problem I encountered. Unfortunately I apparently dropped it before I managed to write a test case. I'll try to dig up the code that triggered the issue.
  • Loading branch information
bors committed Oct 30, 2014
2 parents 2d27bfa + b9251cd commit c40fc79
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/librustc/middle/check_static_recursion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,17 @@ impl<'a, 'ast, 'v> Visitor<'v> for CheckItemRecursionVisitor<'a, 'ast> {
Some(&DefStatic(def_id, _)) |
Some(&DefConst(def_id)) if
ast_util::is_local(def_id) => {
self.visit_item(&*self.ast_map.expect_item(def_id.node));
match self.ast_map.get(def_id.node) {
ast_map::NodeItem(item) =>
self.visit_item(item),
ast_map::NodeForeignItem(_) => {},
_ => {
self.sess.span_err(e.span,
format!("expected item, found {}",
self.ast_map.node_to_string(def_id.node)).as_slice());
return;
},
}
}
_ => ()
}
Expand Down
19 changes: 19 additions & 0 deletions src/test/auxiliary/check_static_recursion_foreign_helper.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2012 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.

// Helper definition for test/run-pass/check-static-recursion-foreign.rs.

#[crate_id = "check_static_recursion_foreign_helper"]
#[crate_type = "lib"]

extern crate libc;

#[no_mangle]
pub static test_static: libc::c_int = 0;
27 changes: 27 additions & 0 deletions src/test/run-pass/check-static-recursion-foreign.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright 2012 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.

// Static recursion check shouldn't fail when given a foreign item (#18279)

// aux-build:check_static_recursion_foreign_helper.rs
extern crate check_static_recursion_foreign_helper;
extern crate libc;

use libc::c_int;

#[link_name = "check_static_recursion_foreign_helper"]
extern "C" {
#[allow(dead_code)]
static test_static: c_int;
}

static B: &'static c_int = &test_static;

pub fn main() {}

0 comments on commit c40fc79

Please sign in to comment.