diff --git a/src/librustc/hir/print.rs b/src/librustc/hir/print.rs index 0a65473de8ff1..d1020a2d151d4 100644 --- a/src/librustc/hir/print.rs +++ b/src/librustc/hir/print.rs @@ -622,7 +622,7 @@ impl<'a> State<'a> { } hir::ItemKind::GlobalAsm(ref ga) => { self.head(visibility_qualified(&item.vis, "global asm"))?; - self.s.word(ga.asm.as_str().get())?; + self.s.word(ga.asm.as_str().to_string())?; self.end()? } hir::ItemKind::Ty(ref ty, ref generics) => { @@ -1591,7 +1591,7 @@ impl<'a> State<'a> { if ident.is_raw_guess() { self.s.word(format!("r#{}", ident.name))?; } else { - self.s.word(ident.as_str().get())?; + self.s.word(ident.as_str().to_string())?; } self.ann.post(self, AnnNode::Name(&ident.name)) } @@ -1998,7 +1998,7 @@ impl<'a> State<'a> { self.commasep(Inconsistent, &decl.inputs, |s, ty| { s.ibox(indent_unit)?; if let Some(arg_name) = arg_names.get(i) { - s.s.word(arg_name.as_str().get())?; + s.s.word(arg_name.as_str().to_string())?; s.s.word(":")?; s.s.space()?; } else if let Some(body_id) = body_id { diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index ae8e57d54de31..af069b527b0b4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2165,9 +2165,11 @@ impl<'a> Parser<'a> { suffix, ) = self.token { let suffix = suffix.and_then(|s| { - let s = s.as_str().get(); - if ["f32", "f64"].contains(&s) { - Some(s) + let s = s.as_str(); + if s == "f32" { + Some("f32") + } else if s == "f64" { + Some("f64") } else { None } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index f5a9aded8455e..ca05ff71c9433 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -645,7 +645,7 @@ pub trait PrintState<'a> { ast::LitKind::Float(ref f, t) => { self.writer().word(format!("{}{}", &f, t.ty_to_string())) } - ast::LitKind::FloatUnsuffixed(ref f) => self.writer().word(f.as_str().get()), + ast::LitKind::FloatUnsuffixed(ref f) => self.writer().word(f.as_str().to_string()), ast::LitKind::Bool(val) => { if val { self.writer().word("true") } else { self.writer().word("false") } } @@ -731,7 +731,7 @@ pub trait PrintState<'a> { if segment.ident.name == keywords::DollarCrate.name() { self.print_dollar_crate(segment.ident)?; } else { - self.writer().word(segment.ident.as_str().get())?; + self.writer().word(segment.ident.as_str().to_string())?; } } } @@ -749,7 +749,7 @@ pub trait PrintState<'a> { } self.maybe_print_comment(attr.span.lo())?; if attr.is_sugared_doc { - self.writer().word(attr.value_str().unwrap().as_str().get())?; + self.writer().word(attr.value_str().unwrap().as_str().to_string())?; self.writer().hardbreak() } else { match attr.style { @@ -858,7 +858,7 @@ pub trait PrintState<'a> { if !ast::Ident::with_empty_ctxt(name).is_path_segment_keyword() { self.writer().word("::")?; } - self.writer().word(name.as_str().get()) + self.writer().word(name.as_str().to_string()) } } @@ -1300,7 +1300,7 @@ impl<'a> State<'a> { } ast::ItemKind::GlobalAsm(ref ga) => { self.head(visibility_qualified(&item.vis, "global_asm!"))?; - self.s.word(ga.asm.as_str().get())?; + self.s.word(ga.asm.as_str().to_string())?; self.end()?; } ast::ItemKind::Ty(ref ty, ref generics) => { @@ -2437,7 +2437,7 @@ impl<'a> State<'a> { if ident.is_raw_guess() { self.s.word(format!("r#{}", ident))?; } else { - self.s.word(ident.as_str().get())?; + self.s.word(ident.as_str().to_string())?; } self.ann.post(self, AnnNode::Ident(&ident)) } @@ -2447,7 +2447,7 @@ impl<'a> State<'a> { } pub fn print_name(&mut self, name: ast::Name) -> io::Result<()> { - self.s.word(name.as_str().get())?; + self.s.word(name.as_str().to_string())?; self.ann.post(self, AnnNode::Name(&name)) } diff --git a/src/libsyntax_ext/proc_macro_server.rs b/src/libsyntax_ext/proc_macro_server.rs index f902e8169b6ba..09dce77579001 100644 --- a/src/libsyntax_ext/proc_macro_server.rs +++ b/src/libsyntax_ext/proc_macro_server.rs @@ -336,11 +336,11 @@ impl Ident { } } fn new(sym: Symbol, is_raw: bool, span: Span) -> Ident { - let string = sym.as_str().get(); - if !Self::is_valid(string) { + let string = sym.as_str(); + if !Self::is_valid(&string) { panic!("`{:?}` is not a valid identifier", string) } - if is_raw && !ast::Ident::from_str(string).can_be_raw() { + if is_raw && !ast::Ident::from_interned_str(sym.as_interned_str()).can_be_raw() { panic!("`{}` cannot be a raw identifier", string); } Ident { sym, is_raw, span } diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index f61aa4284d29b..393f52e7de517 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -524,7 +524,11 @@ impl LocalInternedString { } } - pub fn get(&self) -> &'static str { + pub fn get(&self) -> &str { + // This returns a valid string since we ensure that `self` outlives the interner + // by creating the interner on a thread which outlives threads which can access it. + // This type cannot move to a thread which outlives the interner since it does + // not implement Send. self.string } }