mirror of https://github.com/rust-lang/rust.git
Rollup merge of #77560 - rschoon:fix-litkind-rc-bytebuf, r=lcnr
Fix LitKind's byte buffer to use refcounted slice While working on adding a new lint for clippy (see https://github.com/rust-lang/rust-clippy/pull/6044) for avoiding shared ownership of "mutable buffer" types (such as using `Rc<Vec<T>>` instead of `Rc<[T]>`), I noticed a type exported from rustc_ast and used by clippy gets caught by the lint. This PR fixes the exported type. This PR includes the actual change to clippy too, but I will open a PR directly against clippy for that part (although it will currently fail to build there).
This commit is contained in:
commit
5c1e01196d
|
@ -1606,7 +1606,7 @@ pub enum LitKind {
|
||||||
/// A string literal (`"foo"`).
|
/// A string literal (`"foo"`).
|
||||||
Str(Symbol, StrStyle),
|
Str(Symbol, StrStyle),
|
||||||
/// A byte string (`b"foo"`).
|
/// A byte string (`b"foo"`).
|
||||||
ByteStr(Lrc<Vec<u8>>),
|
ByteStr(Lrc<[u8]>),
|
||||||
/// A byte char (`b'f'`).
|
/// A byte char (`b'f'`).
|
||||||
Byte(u8),
|
Byte(u8),
|
||||||
/// A character literal (`'a'`).
|
/// A character literal (`'a'`).
|
||||||
|
|
|
@ -4,7 +4,6 @@ use crate::ast::{self, Lit, LitKind};
|
||||||
use crate::token::{self, Token};
|
use crate::token::{self, Token};
|
||||||
use crate::tokenstream::TokenTree;
|
use crate::tokenstream::TokenTree;
|
||||||
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
|
||||||
use rustc_lexer::unescape::{unescape_byte, unescape_char};
|
use rustc_lexer::unescape::{unescape_byte, unescape_char};
|
||||||
use rustc_lexer::unescape::{unescape_byte_literal, unescape_literal, Mode};
|
use rustc_lexer::unescape::{unescape_byte_literal, unescape_literal, Mode};
|
||||||
use rustc_span::symbol::{kw, sym, Symbol};
|
use rustc_span::symbol::{kw, sym, Symbol};
|
||||||
|
@ -108,7 +107,7 @@ impl LitKind {
|
||||||
});
|
});
|
||||||
error?;
|
error?;
|
||||||
buf.shrink_to_fit();
|
buf.shrink_to_fit();
|
||||||
LitKind::ByteStr(Lrc::new(buf))
|
LitKind::ByteStr(buf.into())
|
||||||
}
|
}
|
||||||
token::ByteStrRaw(_) => {
|
token::ByteStrRaw(_) => {
|
||||||
let s = symbol.as_str();
|
let s = symbol.as_str();
|
||||||
|
@ -128,7 +127,7 @@ impl LitKind {
|
||||||
symbol.to_string().into_bytes()
|
symbol.to_string().into_bytes()
|
||||||
};
|
};
|
||||||
|
|
||||||
LitKind::ByteStr(Lrc::new(bytes))
|
LitKind::ByteStr(bytes.into())
|
||||||
}
|
}
|
||||||
token::Err => LitKind::Err(symbol),
|
token::Err => LitKind::Err(symbol),
|
||||||
})
|
})
|
||||||
|
|
|
@ -13,8 +13,6 @@ use rustc_span::{self, Pos, Span};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use rustc_data_structures::sync::Lrc;
|
|
||||||
|
|
||||||
// These macros all relate to the file system; they either return
|
// These macros all relate to the file system; they either return
|
||||||
// the column/row/filename of the expression, or they include
|
// the column/row/filename of the expression, or they include
|
||||||
// a given file into the current one.
|
// a given file into the current one.
|
||||||
|
@ -216,7 +214,7 @@ pub fn expand_include_bytes(
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
match cx.source_map().load_binary_file(&file) {
|
match cx.source_map().load_binary_file(&file) {
|
||||||
Ok(bytes) => base::MacEager::expr(cx.expr_lit(sp, ast::LitKind::ByteStr(Lrc::new(bytes)))),
|
Ok(bytes) => base::MacEager::expr(cx.expr_lit(sp, ast::LitKind::ByteStr(bytes.into()))),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
cx.span_err(sp, &format!("couldn't read {}: {}", file.display(), e));
|
cx.span_err(sp, &format!("couldn't read {}: {}", file.display(), e));
|
||||||
DummyResult::any(sp)
|
DummyResult::any(sp)
|
||||||
|
|
|
@ -31,7 +31,7 @@ crate fn lit_to_const<'tcx>(
|
||||||
(ast::LitKind::ByteStr(data), ty::Ref(_, inner_ty, _))
|
(ast::LitKind::ByteStr(data), ty::Ref(_, inner_ty, _))
|
||||||
if matches!(inner_ty.kind(), ty::Slice(_)) =>
|
if matches!(inner_ty.kind(), ty::Slice(_)) =>
|
||||||
{
|
{
|
||||||
let allocation = Allocation::from_byte_aligned_bytes(data as &Vec<u8>);
|
let allocation = Allocation::from_byte_aligned_bytes(data as &[u8]);
|
||||||
let allocation = tcx.intern_const_alloc(allocation);
|
let allocation = tcx.intern_const_alloc(allocation);
|
||||||
ConstValue::Slice { data: allocation, start: 0, end: data.len() }
|
ConstValue::Slice { data: allocation, start: 0, end: data.len() }
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,7 +155,7 @@ pub fn lit_to_constant(lit: &LitKind, ty: Option<Ty<'_>>) -> Constant {
|
||||||
match *lit {
|
match *lit {
|
||||||
LitKind::Str(ref is, _) => Constant::Str(is.to_string()),
|
LitKind::Str(ref is, _) => Constant::Str(is.to_string()),
|
||||||
LitKind::Byte(b) => Constant::Int(u128::from(b)),
|
LitKind::Byte(b) => Constant::Int(u128::from(b)),
|
||||||
LitKind::ByteStr(ref s) => Constant::Binary(Lrc::from(s.as_slice())),
|
LitKind::ByteStr(ref s) => Constant::Binary(Lrc::clone(s)),
|
||||||
LitKind::Char(c) => Constant::Char(c),
|
LitKind::Char(c) => Constant::Char(c),
|
||||||
LitKind::Int(n, _) => Constant::Int(n),
|
LitKind::Int(n, _) => Constant::Int(n),
|
||||||
LitKind::Float(ref is, LitFloatType::Suffixed(fty)) => match fty {
|
LitKind::Float(ref is, LitFloatType::Suffixed(fty)) => match fty {
|
||||||
|
|
Loading…
Reference in New Issue