diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs index 715dbb16ae4..d50776b6062 100644 --- a/src/librustc/dep_graph/dep_node.rs +++ b/src/librustc/dep_graph/dep_node.rs @@ -627,7 +627,6 @@ define_dep_nodes!( <'tcx> [input] AllCrateNums, [] ExportedSymbols(CrateNum), [eval_always] CollectAndPartitionTranslationItems, - [] ExportName(DefId), [] ContainsExternIndicator(DefId), [] IsTranslatedItem(DefId), [] CodegenUnit(InternedString), diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index f997a57d5d7..c2fbf4df489 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -2216,6 +2216,7 @@ pub fn provide(providers: &mut Providers) { pub struct TransFnAttrs { pub flags: TransFnAttrFlags, pub inline: InlineAttr, + pub export_name: Option, } bitflags! { @@ -2234,6 +2235,7 @@ impl TransFnAttrs { TransFnAttrs { flags: TransFnAttrFlags::empty(), inline: InlineAttr::None, + export_name: None, } } diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index 4720c0ca583..75c3f8ef28a 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -1147,10 +1147,12 @@ impl<'hir> HashStable> for hir::TransFnAttrs let hir::TransFnAttrs { flags, inline, + export_name, } = *self; flags.hash_stable(hcx, hasher); inline.hash_stable(hcx, hasher); + export_name.hash_stable(hcx, hasher); } } diff --git a/src/librustc/ty/maps/mod.rs b/src/librustc/ty/maps/mod.rs index fd3aee77e36..3a8dddaec11 100644 --- a/src/librustc/ty/maps/mod.rs +++ b/src/librustc/ty/maps/mod.rs @@ -363,7 +363,6 @@ define_maps! { <'tcx> [] fn collect_and_partition_translation_items: collect_and_partition_translation_items_node(CrateNum) -> (Arc, Arc>>>), - [] fn export_name: ExportName(DefId) -> Option, [] fn contains_extern_indicator: ContainsExternIndicator(DefId) -> bool, [] fn symbol_export_level: GetSymbolExportLevel(DefId) -> SymbolExportLevel, [] fn is_translated_item: IsTranslatedItem(DefId) -> bool, diff --git a/src/librustc/ty/maps/plumbing.rs b/src/librustc/ty/maps/plumbing.rs index 9082037e10c..3c70257be71 100644 --- a/src/librustc/ty/maps/plumbing.rs +++ b/src/librustc/ty/maps/plumbing.rs @@ -926,7 +926,6 @@ pub fn force_from_dep_node<'a, 'gcx, 'lcx>(tcx: TyCtxt<'a, 'gcx, 'lcx>, DepKind::CollectAndPartitionTranslationItems => { force!(collect_and_partition_translation_items, LOCAL_CRATE); } - DepKind::ExportName => { force!(export_name, def_id!()); } DepKind::ContainsExternIndicator => { force!(contains_extern_indicator, def_id!()); } diff --git a/src/librustc_trans_utils/diagnostics.rs b/src/librustc_trans_utils/diagnostics.rs deleted file mode 100644 index 13fa15faf41..00000000000 --- a/src/librustc_trans_utils/diagnostics.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2017 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![allow(non_snake_case)] - -register_long_diagnostics! { - -E0558: r##" -The `export_name` attribute was malformed. - -Erroneous code example: - -```ignore (error-emitted-at-codegen-which-cannot-be-handled-by-compile_fail) -#[export_name] // error: export_name attribute has invalid format -pub fn something() {} - -fn main() {} -``` - -The `export_name` attribute expects a string in order to determine the name of -the exported symbol. Example: - -``` -#[export_name = "some_function"] // ok! -pub fn something() {} - -fn main() {} -``` -"##, - -} diff --git a/src/librustc_trans_utils/lib.rs b/src/librustc_trans_utils/lib.rs index d636a5f2e64..08265d5f618 100644 --- a/src/librustc_trans_utils/lib.rs +++ b/src/librustc_trans_utils/lib.rs @@ -37,7 +37,6 @@ extern crate rustc; extern crate rustc_back; extern crate rustc_mir; extern crate rustc_incremental; -#[macro_use] extern crate syntax; extern crate syntax_pos; extern crate rustc_data_structures; @@ -46,7 +45,6 @@ pub extern crate rustc as __rustc; use rustc::ty::TyCtxt; -pub mod diagnostics; pub mod link; pub mod trans_crate; pub mod symbol_names; diff --git a/src/librustc_trans_utils/symbol_names.rs b/src/librustc_trans_utils/symbol_names.rs index fb299bf7eea..6c96620f7b6 100644 --- a/src/librustc_trans_utils/symbol_names.rs +++ b/src/librustc_trans_utils/symbol_names.rs @@ -120,27 +120,9 @@ pub fn provide(providers: &mut Providers) { def_symbol_name, symbol_name, - export_name: |tcx, id| { - tcx.get_attrs(id).iter().fold(None, |ia, attr| { - if attr.check_name("export_name") { - if let s @ Some(_) = attr.value_str() { - s - } else { - struct_span_err!(tcx.sess, attr.span, E0558, - "export_name attribute has invalid format") - .span_label(attr.span, "did you mean #[export_name=\"*\"]?") - .emit(); - None - } - } else { - ia - } - }) - }, - contains_extern_indicator: |tcx, id| { attr::contains_name(&tcx.get_attrs(id), "no_mangle") || - tcx.export_name(id).is_some() + tcx.trans_fn_attrs(id).export_name.is_some() }, ..*providers @@ -287,7 +269,7 @@ fn compute_symbol_name<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, instance: Instance return tcx.item_name(def_id).to_string(); } - if let Some(name) = tcx.export_name(def_id) { + if let Some(name) = tcx.trans_fn_attrs(def_id).export_name { // Use provided name return name.to_string(); } diff --git a/src/librustc_trans_utils/trans_crate.rs b/src/librustc_trans_utils/trans_crate.rs index 443cece66e2..175729ad19f 100644 --- a/src/librustc_trans_utils/trans_crate.rs +++ b/src/librustc_trans_utils/trans_crate.rs @@ -233,7 +233,6 @@ impl TransCrate for MetadataOnlyTransCrate { MonoItem::Fn(inst) => { let def_id = inst.def_id(); if def_id.is_local() { - let _ = tcx.export_name(def_id); let _ = tcx.contains_extern_indicator(def_id); let _ = inst.def.is_inline(tcx); let _ = tcx.trans_fn_attrs(def_id); diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 6793f478dd6..55d77ee27fe 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1777,6 +1777,15 @@ fn trans_fn_attrs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefId) -> TransFnAt _ => ia, } }); + } else if attr.check_name("export_name") { + if let s @ Some(_) = attr.value_str() { + trans_fn_attrs.export_name = s; + } else { + struct_span_err!(tcx.sess, attr.span, E0558, + "export_name attribute has invalid format") + .span_label(attr.span, "did you mean #[export_name=\"*\"]?") + .emit(); + } } } diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs index a0844dc259e..96b2ec745f1 100644 --- a/src/librustc_typeck/diagnostics.rs +++ b/src/librustc_typeck/diagnostics.rs @@ -3774,6 +3774,29 @@ For more information about the inline attribute, https: read://doc.rust-lang.org/reference.html#inline-attributes "##, +E0558: r##" +The `export_name` attribute was malformed. + +Erroneous code example: + +```ignore (error-emitted-at-codegen-which-cannot-be-handled-by-compile_fail) +#[export_name] // error: export_name attribute has invalid format +pub fn something() {} + +fn main() {} +``` + +The `export_name` attribute expects a string in order to determine the name of +the exported symbol. Example: + +``` +#[export_name = "some_function"] // ok! +pub fn something() {} + +fn main() {} +``` +"##, + E0559: r##" An unknown field was specified into an enum's structure variant.