Skip to content

Commit

Permalink
Auto merge of #61035 - nnethercote:avoid-more-symbol-interning, r=pet…
Browse files Browse the repository at this point in the history
…rochenkov

Avoid more symbol interning

r? @petrochenkov
  • Loading branch information
bors committed May 27, 2019
2 parents be10e62 + 33a3206 commit ab7cf71
Show file tree
Hide file tree
Showing 50 changed files with 299 additions and 228 deletions.
1 change: 1 addition & 0 deletions Cargo.lock
Expand Up @@ -3009,6 +3009,7 @@ dependencies = [
"rustc_cratesio_shim 0.0.0", "rustc_cratesio_shim 0.0.0",
"rustc_data_structures 0.0.0", "rustc_data_structures 0.0.0",
"serialize 0.0.0", "serialize 0.0.0",
"syntax_pos 0.0.0",
] ]


[[package]] [[package]]
Expand Down
10 changes: 3 additions & 7 deletions src/librustc/hir/lowering.rs
Expand Up @@ -1145,9 +1145,7 @@ impl<'a> LoweringContext<'a> {
let unstable_span = self.sess.source_map().mark_span_with_reason( let unstable_span = self.sess.source_map().mark_span_with_reason(
CompilerDesugaringKind::Async, CompilerDesugaringKind::Async,
span, span,
Some(vec![ Some(vec![sym::gen_future].into()),
Symbol::intern("gen_future"),
].into()),
); );
let gen_future = self.expr_std_path( let gen_future = self.expr_std_path(
unstable_span, &[sym::future, sym::from_generator], None, ThinVec::new()); unstable_span, &[sym::future, sym::from_generator], None, ThinVec::new());
Expand Down Expand Up @@ -2958,7 +2956,7 @@ impl<'a> LoweringContext<'a> {
ident: match f.ident { ident: match f.ident {
Some(ident) => ident, Some(ident) => ident,
// FIXME(jseyfried): positional field hygiene // FIXME(jseyfried): positional field hygiene
None => Ident::new(Symbol::intern(&index.to_string()), f.span), None => Ident::new(sym::integer(index), f.span),
}, },
vis: self.lower_visibility(&f.vis, None), vis: self.lower_visibility(&f.vis, None),
ty: self.lower_ty(&f.ty, ImplTraitContext::disallowed()), ty: self.lower_ty(&f.ty, ImplTraitContext::disallowed()),
Expand Down Expand Up @@ -4177,9 +4175,7 @@ impl<'a> LoweringContext<'a> {
let unstable_span = this.sess.source_map().mark_span_with_reason( let unstable_span = this.sess.source_map().mark_span_with_reason(
CompilerDesugaringKind::TryBlock, CompilerDesugaringKind::TryBlock,
body.span, body.span,
Some(vec![ Some(vec![sym::try_trait].into()),
Symbol::intern("try_trait"),
].into()),
); );
let mut block = this.lower_block(body, true).into_inner(); let mut block = this.lower_block(body, true).into_inner();
let tail = block.expr.take().map_or_else( let tail = block.expr.take().map_or_else(
Expand Down
5 changes: 2 additions & 3 deletions src/librustc/hir/map/def_collector.rs
Expand Up @@ -5,8 +5,7 @@ use crate::session::CrateDisambiguator;
use syntax::ast::*; use syntax::ast::*;
use syntax::ext::hygiene::Mark; use syntax::ext::hygiene::Mark;
use syntax::visit; use syntax::visit;
use syntax::symbol::kw; use syntax::symbol::{kw, sym};
use syntax::symbol::Symbol;
use syntax::parse::token::{self, Token}; use syntax::parse::token::{self, Token};
use syntax_pos::Span; use syntax_pos::Span;


Expand Down Expand Up @@ -221,7 +220,7 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
_: &'a Generics, _: NodeId, _: Span) { _: &'a Generics, _: NodeId, _: Span) {
for (index, field) in data.fields().iter().enumerate() { for (index, field) in data.fields().iter().enumerate() {
let name = field.ident.map(|ident| ident.name) let name = field.ident.map(|ident| ident.name)
.unwrap_or_else(|| Symbol::intern(&index.to_string())); .unwrap_or_else(|| sym::integer(index));
let def = self.create_def(field.id, let def = self.create_def(field.id,
DefPathData::ValueNs(name.as_interned_str()), DefPathData::ValueNs(name.as_interned_str()),
field.span); field.span);
Expand Down
4 changes: 2 additions & 2 deletions src/librustc/middle/lang_items.rs
Expand Up @@ -210,8 +210,8 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
pub fn extract(attrs: &[ast::Attribute]) -> Option<(Symbol, Span)> { pub fn extract(attrs: &[ast::Attribute]) -> Option<(Symbol, Span)> {
attrs.iter().find_map(|attr| Some(match attr { attrs.iter().find_map(|attr| Some(match attr {
_ if attr.check_name(sym::lang) => (attr.value_str()?, attr.span), _ if attr.check_name(sym::lang) => (attr.value_str()?, attr.span),
_ if attr.check_name(sym::panic_handler) => (Symbol::intern("panic_impl"), attr.span), _ if attr.check_name(sym::panic_handler) => (sym::panic_impl, attr.span),
_ if attr.check_name(sym::alloc_error_handler) => (Symbol::intern("oom"), attr.span), _ if attr.check_name(sym::alloc_error_handler) => (sym::oom, attr.span),
_ => return None, _ => return None,
})) }))
} }
Expand Down
4 changes: 2 additions & 2 deletions src/librustc/middle/mem_categorization.rs
Expand Up @@ -1316,7 +1316,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {


for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) { for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
let subpat_ty = self.pat_ty_adjusted(&subpat)?; // see (*2) let subpat_ty = self.pat_ty_adjusted(&subpat)?; // see (*2)
let interior = InteriorField(FieldIndex(i, Name::intern(&i.to_string()))); let interior = InteriorField(FieldIndex(i, sym::integer(i)));
let subcmt = Rc::new( let subcmt = Rc::new(
self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior)); self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior));
self.cat_pattern_(subcmt, &subpat, op)?; self.cat_pattern_(subcmt, &subpat, op)?;
Expand Down Expand Up @@ -1363,7 +1363,7 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
}; };
for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) { for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
let subpat_ty = self.pat_ty_adjusted(&subpat)?; // see (*2) let subpat_ty = self.pat_ty_adjusted(&subpat)?; // see (*2)
let interior = InteriorField(FieldIndex(i, Name::intern(&i.to_string()))); let interior = InteriorField(FieldIndex(i, sym::integer(i)));
let subcmt = Rc::new( let subcmt = Rc::new(
self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior)); self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior));
self.cat_pattern_(subcmt, &subpat, op)?; self.cat_pattern_(subcmt, &subpat, op)?;
Expand Down
4 changes: 2 additions & 2 deletions src/librustc/middle/stability.rs
Expand Up @@ -437,7 +437,7 @@ impl<'a, 'tcx> Index<'tcx> {
reason: Some(Symbol::intern(reason)), reason: Some(Symbol::intern(reason)),
issue: 27812, issue: 27812,
}, },
feature: Symbol::intern("rustc_private"), feature: sym::rustc_private,
rustc_depr: None, rustc_depr: None,
const_stability: None, const_stability: None,
promotable: false, promotable: false,
Expand Down Expand Up @@ -880,7 +880,7 @@ pub fn check_unused_or_stable_features<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
// FIXME: only remove `libc` when `stdbuild` is active. // FIXME: only remove `libc` when `stdbuild` is active.
// FIXME: remove special casing for `test`. // FIXME: remove special casing for `test`.
remaining_lib_features.remove(&Symbol::intern("libc")); remaining_lib_features.remove(&Symbol::intern("libc"));
remaining_lib_features.remove(&Symbol::intern("test")); remaining_lib_features.remove(&sym::test);


let check_features = let check_features =
|remaining_lib_features: &mut FxHashMap<_, _>, defined_features: &[_]| { |remaining_lib_features: &mut FxHashMap<_, _>, defined_features: &[_]| {
Expand Down
19 changes: 9 additions & 10 deletions src/librustc/session/config.rs
Expand Up @@ -19,7 +19,7 @@ use syntax::source_map::{FileName, FilePathMapping};
use syntax::edition::{Edition, EDITION_NAME_LIST, DEFAULT_EDITION}; use syntax::edition::{Edition, EDITION_NAME_LIST, DEFAULT_EDITION};
use syntax::parse::token; use syntax::parse::token;
use syntax::parse; use syntax::parse;
use syntax::symbol::Symbol; use syntax::symbol::{sym, Symbol};
use syntax::feature_gate::UnstableFeatures; use syntax::feature_gate::UnstableFeatures;
use errors::emitter::HumanReadableErrorType; use errors::emitter::HumanReadableErrorType;


Expand Down Expand Up @@ -1503,31 +1503,31 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
Some(Symbol::intern(vendor)), Some(Symbol::intern(vendor)),
)); ));
if sess.target.target.options.has_elf_tls { if sess.target.target.options.has_elf_tls {
ret.insert((Symbol::intern("target_thread_local"), None)); ret.insert((sym::target_thread_local, None));
} }
for &i in &[8, 16, 32, 64, 128] { for &i in &[8, 16, 32, 64, 128] {
if i >= min_atomic_width && i <= max_atomic_width { if i >= min_atomic_width && i <= max_atomic_width {
let s = i.to_string(); let s = i.to_string();
ret.insert(( ret.insert((
Symbol::intern("target_has_atomic"), sym::target_has_atomic,
Some(Symbol::intern(&s)), Some(Symbol::intern(&s)),
)); ));
if &s == wordsz { if &s == wordsz {
ret.insert(( ret.insert((
Symbol::intern("target_has_atomic"), sym::target_has_atomic,
Some(Symbol::intern("ptr")), Some(Symbol::intern("ptr")),
)); ));
} }
} }
} }
if atomic_cas { if atomic_cas {
ret.insert((Symbol::intern("target_has_atomic"), Some(Symbol::intern("cas")))); ret.insert((sym::target_has_atomic, Some(Symbol::intern("cas"))));
} }
if sess.opts.debug_assertions { if sess.opts.debug_assertions {
ret.insert((Symbol::intern("debug_assertions"), None)); ret.insert((Symbol::intern("debug_assertions"), None));
} }
if sess.opts.crate_types.contains(&CrateType::ProcMacro) { if sess.opts.crate_types.contains(&CrateType::ProcMacro) {
ret.insert((Symbol::intern("proc_macro"), None)); ret.insert((sym::proc_macro, None));
} }
ret ret
} }
Expand All @@ -1547,7 +1547,7 @@ pub fn build_configuration(sess: &Session, mut user_cfg: ast::CrateConfig) -> as
let default_cfg = default_configuration(sess); let default_cfg = default_configuration(sess);
// If the user wants a test runner, then add the test cfg // If the user wants a test runner, then add the test cfg
if sess.opts.test { if sess.opts.test {
user_cfg.insert((Symbol::intern("test"), None)); user_cfg.insert((sym::test, None));
} }
user_cfg.extend(default_cfg.iter().cloned()); user_cfg.extend(default_cfg.iter().cloned());
user_cfg user_cfg
Expand Down Expand Up @@ -2702,7 +2702,7 @@ mod tests {
use std::path::PathBuf; use std::path::PathBuf;
use super::{Externs, OutputType, OutputTypes}; use super::{Externs, OutputType, OutputTypes};
use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel}; use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel};
use syntax::symbol::Symbol; use syntax::symbol::sym;
use syntax::edition::{Edition, DEFAULT_EDITION}; use syntax::edition::{Edition, DEFAULT_EDITION};
use syntax; use syntax;
use super::Options; use super::Options;
Expand Down Expand Up @@ -2744,15 +2744,14 @@ mod tests {
let (sessopts, cfg) = build_session_options_and_crate_config(matches); let (sessopts, cfg) = build_session_options_and_crate_config(matches);
let sess = build_session(sessopts, None, registry); let sess = build_session(sessopts, None, registry);
let cfg = build_configuration(&sess, to_crate_config(cfg)); let cfg = build_configuration(&sess, to_crate_config(cfg));
assert!(cfg.contains(&(Symbol::intern("test"), None))); assert!(cfg.contains(&(sym::test, None)));
}); });
} }


// When the user supplies --test and --cfg test, don't implicitly add // When the user supplies --test and --cfg test, don't implicitly add
// another --cfg test // another --cfg test
#[test] #[test]
fn test_switch_implies_cfg_test_unless_cfg_test() { fn test_switch_implies_cfg_test_unless_cfg_test() {
use syntax::symbol::sym;
syntax::with_default_globals(|| { syntax::with_default_globals(|| {
let matches = &match optgroups().parse(&["--test".to_string(), let matches = &match optgroups().parse(&["--test".to_string(),
"--cfg=test".to_string()]) { "--cfg=test".to_string()]) {
Expand Down
6 changes: 2 additions & 4 deletions src/librustc_allocator/expand.rs
Expand Up @@ -91,9 +91,7 @@ impl MutVisitor for ExpandAllocatorDirectives<'_> {
call_site: item.span, // use the call site of the static call_site: item.span, // use the call site of the static
def_site: None, def_site: None,
format: MacroAttribute(Symbol::intern(name)), format: MacroAttribute(Symbol::intern(name)),
allow_internal_unstable: Some(vec![ allow_internal_unstable: Some(vec![sym::rustc_attrs].into()),
Symbol::intern("rustc_attrs"),
].into()),
allow_internal_unsafe: false, allow_internal_unsafe: false,
local_inner_macros: false, local_inner_macros: false,
edition: self.sess.edition, edition: self.sess.edition,
Expand Down Expand Up @@ -223,7 +221,7 @@ impl AllocFnFactory<'_> {
} }


fn attrs(&self) -> Vec<Attribute> { fn attrs(&self) -> Vec<Attribute> {
let special = Symbol::intern("rustc_std_internal_symbol"); let special = sym::rustc_std_internal_symbol;
let special = self.cx.meta_word(self.span, special); let special = self.cx.meta_word(self.span, special);
vec![self.cx.attribute(self.span, special)] vec![self.cx.attribute(self.span, special)]
} }
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_interface/util.rs
Expand Up @@ -68,7 +68,7 @@ pub fn add_configuration(
sess: &Session, sess: &Session,
codegen_backend: &dyn CodegenBackend, codegen_backend: &dyn CodegenBackend,
) { ) {
let tf = Symbol::intern("target_feature"); let tf = sym::target_feature;


cfg.extend( cfg.extend(
codegen_backend codegen_backend
Expand Down
6 changes: 3 additions & 3 deletions src/librustc_lint/builtin.rs
Expand Up @@ -1439,8 +1439,8 @@ impl KeywordIdents {
{ {
let next_edition = match cx.sess.edition() { let next_edition = match cx.sess.edition() {
Edition::Edition2015 => { Edition::Edition2015 => {
match &ident.as_str()[..] { match ident.name {
"async" | "await" | "try" => Edition::Edition2018, kw::Async | kw::Await | kw::Try => Edition::Edition2018,


// rust-lang/rust#56327: Conservatively do not // rust-lang/rust#56327: Conservatively do not
// attempt to report occurrences of `dyn` within // attempt to report occurrences of `dyn` within
Expand All @@ -1454,7 +1454,7 @@ impl KeywordIdents {
// its precise role in the parsed AST and thus are // its precise role in the parsed AST and thus are
// assured this is truly an attempt to use it as // assured this is truly an attempt to use it as
// an identifier. // an identifier.
"dyn" if !under_macro => Edition::Edition2018, kw::Dyn if !under_macro => Edition::Edition2018,


_ => return, _ => return,
} }
Expand Down
20 changes: 20 additions & 0 deletions src/librustc_macros/src/symbols.rs
Expand Up @@ -96,6 +96,7 @@ pub fn symbols(input: TokenStream) -> TokenStream {


let mut keyword_stream = quote! {}; let mut keyword_stream = quote! {};
let mut symbols_stream = quote! {}; let mut symbols_stream = quote! {};
let mut digits_stream = quote! {};
let mut prefill_stream = quote! {}; let mut prefill_stream = quote! {};
let mut counter = 0u32; let mut counter = 0u32;
let mut keys = HashSet::<String>::new(); let mut keys = HashSet::<String>::new();
Expand All @@ -106,6 +107,7 @@ pub fn symbols(input: TokenStream) -> TokenStream {
} }
}; };


// Generate the listed keywords.
for keyword in &input.keywords.0 { for keyword in &input.keywords.0 {
let name = &keyword.name; let name = &keyword.name;
let value = &keyword.value; let value = &keyword.value;
Expand All @@ -119,6 +121,7 @@ pub fn symbols(input: TokenStream) -> TokenStream {
counter += 1; counter += 1;
} }


// Generate the listed symbols.
for symbol in &input.symbols.0 { for symbol in &input.symbols.0 {
let name = &symbol.name; let name = &symbol.name;
let value = match &symbol.value { let value = match &symbol.value {
Expand All @@ -135,6 +138,19 @@ pub fn symbols(input: TokenStream) -> TokenStream {
counter += 1; counter += 1;
} }


// Generate symbols for the strings "0", "1", ..., "9".
for n in 0..10 {
let n = n.to_string();
check_dup(&n);
prefill_stream.extend(quote! {
#n,
});
digits_stream.extend(quote! {
Symbol::new(#counter),
});
counter += 1;
}

let tt = TokenStream::from(quote! { let tt = TokenStream::from(quote! {
macro_rules! keywords { macro_rules! keywords {
() => { () => {
Expand All @@ -145,6 +161,10 @@ pub fn symbols(input: TokenStream) -> TokenStream {
macro_rules! symbols { macro_rules! symbols {
() => { () => {
#symbols_stream #symbols_stream

pub const digits_array: &[Symbol; 10] = &[
#digits_stream
];
} }
} }


Expand Down
4 changes: 1 addition & 3 deletions src/librustc_metadata/cstore_impl.rs
Expand Up @@ -431,9 +431,7 @@ impl cstore::CStore {
let client = proc_macro::bridge::client::Client::expand1(proc_macro::quote); let client = proc_macro::bridge::client::Client::expand1(proc_macro::quote);
let ext = SyntaxExtension::ProcMacro { let ext = SyntaxExtension::ProcMacro {
expander: Box::new(BangProcMacro { client }), expander: Box::new(BangProcMacro { client }),
allow_internal_unstable: Some(vec![ allow_internal_unstable: Some(vec![sym::proc_macro_def_site].into()),
Symbol::intern("proc_macro_def_site"),
].into()),
edition: data.root.edition, edition: data.root.edition,
}; };
return LoadedMacro::ProcMacro(Lrc::new(ext)); return LoadedMacro::ProcMacro(Lrc::new(ext));
Expand Down
4 changes: 2 additions & 2 deletions src/librustc_mir/interpret/validity.rs
Expand Up @@ -2,7 +2,7 @@ use std::fmt::Write;
use std::hash::Hash; use std::hash::Hash;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;


use syntax_pos::symbol::Symbol; use syntax_pos::symbol::{sym, Symbol};
use rustc::hir; use rustc::hir;
use rustc::ty::layout::{self, Size, Align, TyLayout, LayoutOf, VariantIdx}; use rustc::ty::layout::{self, Size, Align, TyLayout, LayoutOf, VariantIdx};
use rustc::ty; use rustc::ty;
Expand Down Expand Up @@ -188,7 +188,7 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> ValidityVisitor<'rt, 'a, '


PathElem::ClosureVar(name.unwrap_or_else(|| { PathElem::ClosureVar(name.unwrap_or_else(|| {
// Fall back to showing the field index. // Fall back to showing the field index.
Symbol::intern(&field.to_string()) sym::integer(field)
})) }))
} }


Expand Down
1 change: 1 addition & 0 deletions src/librustc_target/Cargo.toml
Expand Up @@ -15,3 +15,4 @@ log = "0.4"
rustc_cratesio_shim = { path = "../librustc_cratesio_shim" } rustc_cratesio_shim = { path = "../librustc_cratesio_shim" }
rustc_data_structures = { path = "../librustc_data_structures" } rustc_data_structures = { path = "../librustc_data_structures" }
serialize = { path = "../libserialize" } serialize = { path = "../libserialize" }
syntax_pos = { path = "../libsyntax_pos" }
8 changes: 8 additions & 0 deletions src/librustc_target/abi/mod.rs
Expand Up @@ -7,6 +7,7 @@ use std::fmt;
use std::ops::{Add, Deref, Sub, Mul, AddAssign, Range, RangeInclusive}; use std::ops::{Add, Deref, Sub, Mul, AddAssign, Range, RangeInclusive};


use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use syntax_pos::symbol::{sym, Symbol};


pub mod call; pub mod call;


Expand Down Expand Up @@ -552,6 +553,13 @@ impl FloatTy {
} }
} }


pub fn to_symbol(self) -> Symbol {
match self {
FloatTy::F32 => sym::f32,
FloatTy::F64 => sym::f64,
}
}

pub fn bit_width(self) -> usize { pub fn bit_width(self) -> usize {
match self { match self {
FloatTy::F32 => 32, FloatTy::F32 => 32,
Expand Down
16 changes: 6 additions & 10 deletions src/librustc_typeck/check/mod.rs
Expand Up @@ -2697,16 +2697,12 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {


fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) { fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
let (tr, name) = match (op, is_mut) { let (tr, name) = match (op, is_mut) {
(PlaceOp::Deref, false) => (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
(self.tcx.lang_items().deref_trait(), "deref"), (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
(PlaceOp::Deref, true) => (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
(self.tcx.lang_items().deref_mut_trait(), "deref_mut"), (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
(PlaceOp::Index, false) =>
(self.tcx.lang_items().index_trait(), "index"),
(PlaceOp::Index, true) =>
(self.tcx.lang_items().index_mut_trait(), "index_mut"),
}; };
(tr, ast::Ident::from_str(name)) (tr, ast::Ident::with_empty_ctxt(name))
} }


fn try_overloaded_place_op(&self, fn try_overloaded_place_op(&self,
Expand Down Expand Up @@ -4948,7 +4944,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
// This is less than ideal, it will not suggest a return type span on any // This is less than ideal, it will not suggest a return type span on any
// method called `main`, regardless of whether it is actually the entry point, // method called `main`, regardless of whether it is actually the entry point,
// but it will still present it as the reason for the expected type. // but it will still present it as the reason for the expected type.
Some((decl, ident, ident.name != Symbol::intern("main"))) Some((decl, ident, ident.name != sym::main))
}), }),
Node::TraitItem(&hir::TraitItem { Node::TraitItem(&hir::TraitItem {
ident, node: hir::TraitItemKind::Method(hir::MethodSig { ident, node: hir::TraitItemKind::Method(hir::MethodSig {
Expand Down

0 comments on commit ab7cf71

Please sign in to comment.