Fix reachable_set
for non-function items in non-library crates
This commit is contained in:
parent
9315a0cd4c
commit
29b73ee5fa
@ -211,22 +211,23 @@ fn propagate_node(&mut self, node: &Node<'tcx>, search_item: LocalDefId) {
|
||||
if !self.any_library {
|
||||
// If we are building an executable, only explicitly extern
|
||||
// types need to be exported.
|
||||
if let Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, ..), def_id, .. })
|
||||
let reachable =
|
||||
if let Node::Item(hir::Item { kind: hir::ItemKind::Fn(sig, ..), .. })
|
||||
| Node::ImplItem(hir::ImplItem {
|
||||
kind: hir::ImplItemKind::Fn(sig, ..),
|
||||
def_id,
|
||||
..
|
||||
kind: hir::ImplItemKind::Fn(sig, ..), ..
|
||||
}) = *node
|
||||
{
|
||||
let reachable = sig.header.abi != Abi::Rust;
|
||||
let codegen_attrs = self.tcx.codegen_fn_attrs(*def_id);
|
||||
sig.header.abi != Abi::Rust
|
||||
} else {
|
||||
false
|
||||
};
|
||||
let codegen_attrs = self.tcx.codegen_fn_attrs(search_item);
|
||||
let is_extern = codegen_attrs.contains_extern_indicator();
|
||||
let std_internal =
|
||||
codegen_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL);
|
||||
if reachable || is_extern || std_internal {
|
||||
self.reachable_symbols.insert(search_item);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// If we are building a library, then reachable symbols will
|
||||
// continue to participate in linkage after this product is
|
||||
|
@ -1,10 +1,11 @@
|
||||
// revisions: lib staticlib
|
||||
// ignore-emscripten default visibility is hidden
|
||||
// compile-flags: -O
|
||||
// `#[no_mangle]`d static variables always have external linkage, i.e., no `internal` in their
|
||||
// definitions
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![no_std]
|
||||
#![cfg_attr(lib, crate_type = "lib")]
|
||||
#![cfg_attr(staticlib, crate_type = "staticlib")]
|
||||
|
||||
// CHECK: @A = local_unnamed_addr constant
|
||||
#[no_mangle]
|
||||
|
Loading…
Reference in New Issue
Block a user