mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Auto merge of #18183 - lnicola:sync-from-rust, r=lnicola
internal: Sync from downstream
This commit is contained in:
commit
7ab2c171bf
10 changed files with 76 additions and 56 deletions
24
Cargo.lock
generated
24
Cargo.lock
generated
|
@ -1485,9 +1485,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ra-ap-rustc_abi"
|
||||
version = "0.63.0"
|
||||
version = "0.68.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b011c39d409940a890414e3a7b239762ac16d88029ad71b050a8374831b93790"
|
||||
checksum = "2a8cb51bb4534ac3e9c74f1d9bd90e607e60f94f734b1cf1a66f753ad2af6ed7"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"ra-ap-rustc_index",
|
||||
|
@ -1496,9 +1496,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ra-ap-rustc_index"
|
||||
version = "0.63.0"
|
||||
version = "0.68.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9027acdee649b0b27eb10b7db5be833efee3362d394935c5eed8f0745a9d43ce"
|
||||
checksum = "8b640fba2b7ef4f875459e2e76daeb846ef341d1d376fa758962ac0eba79bce6"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"ra-ap-rustc_index_macros",
|
||||
|
@ -1507,9 +1507,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ra-ap-rustc_index_macros"
|
||||
version = "0.63.0"
|
||||
version = "0.68.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "540b86dc0384141ac8e825fc2874cd44bffd4277d99d8ec63ee416f1a98d5997"
|
||||
checksum = "faef502419ba5ac9d3079b1a835c6e5b4e605388254bbe55eb5683936f541be9"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -1518,9 +1518,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ra-ap-rustc_lexer"
|
||||
version = "0.63.0"
|
||||
version = "0.68.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3bdf98bb457b47b9ae4aeebf867d0ca440c86925e0b6381658c4a02589748c9d"
|
||||
checksum = "5da7f9d533b8d5be6704558da741ff20b982ad4647b1e9e08632853e4fecf9d5"
|
||||
dependencies = [
|
||||
"unicode-properties",
|
||||
"unicode-xid",
|
||||
|
@ -1528,9 +1528,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ra-ap-rustc_parse_format"
|
||||
version = "0.63.0"
|
||||
version = "0.68.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8fe3556ab6311bb775220563a300e2bf62ec56404521fe0c511a583937683d5"
|
||||
checksum = "94389cf81c651b1bda9ac45d3de6a2d851bb6fd4cb893875daa44e419c94205f"
|
||||
dependencies = [
|
||||
"ra-ap-rustc_index",
|
||||
"ra-ap-rustc_lexer",
|
||||
|
@ -1538,9 +1538,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ra-ap-rustc_pattern_analysis"
|
||||
version = "0.63.0"
|
||||
version = "0.68.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1709080fdeb5db630e1c2644026c2962aaa32416cd92f0190c04b0c21e114b91"
|
||||
checksum = "3679d8dd0114ed6000918309f843782738e51c99d8e4baec0d0f706e4d948819"
|
||||
dependencies = [
|
||||
"ra-ap-rustc_index",
|
||||
"rustc-hash",
|
||||
|
|
10
Cargo.toml
10
Cargo.toml
|
@ -85,11 +85,11 @@ tt = { path = "./crates/tt", version = "0.0.0" }
|
|||
vfs-notify = { path = "./crates/vfs-notify", version = "0.0.0" }
|
||||
vfs = { path = "./crates/vfs", version = "0.0.0" }
|
||||
|
||||
ra-ap-rustc_lexer = { version = "0.63.0", default-features = false }
|
||||
ra-ap-rustc_parse_format = { version = "0.63.0", default-features = false }
|
||||
ra-ap-rustc_index = { version = "0.63.0", default-features = false }
|
||||
ra-ap-rustc_abi = { version = "0.63.0", default-features = false }
|
||||
ra-ap-rustc_pattern_analysis = { version = "0.63.0", default-features = false }
|
||||
ra-ap-rustc_lexer = { version = "0.68.0", default-features = false }
|
||||
ra-ap-rustc_parse_format = { version = "0.68.0", default-features = false }
|
||||
ra-ap-rustc_index = { version = "0.68.0", default-features = false }
|
||||
ra-ap-rustc_abi = { version = "0.68.0", default-features = false }
|
||||
ra-ap-rustc_pattern_analysis = { version = "0.68.0", default-features = false }
|
||||
|
||||
# local crates that aren't published to crates.io. These should not have versions.
|
||||
test-fixture = { path = "./crates/test-fixture" }
|
||||
|
|
|
@ -464,6 +464,9 @@ pub const INERT_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
// Used by the `rustc::potential_query_instability` lint to warn methods which
|
||||
// might not be stable during incremental compilation.
|
||||
rustc_attr!(rustc_lint_query_instability, Normal, template!(Word), WarnFollowing, INTERNAL_UNSTABLE),
|
||||
// Used by the `rustc::untracked_query_information` lint to warn methods which
|
||||
// might break incremental compilation.
|
||||
rustc_attr!(rustc_lint_untracked_query_information, Normal, template!(Word), WarnFollowing, INTERNAL_UNSTABLE),
|
||||
// Used by the `rustc::untranslatable_diagnostic` and `rustc::diagnostic_outside_of_impl` lints
|
||||
// to assist in changes to diagnostic APIs.
|
||||
rustc_attr!(rustc_lint_diagnostics, Normal, template!(Word), WarnFollowing, INTERNAL_UNSTABLE),
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
//! Compute the binary representation of a type
|
||||
|
||||
use std::{borrow::Cow, fmt};
|
||||
use std::fmt;
|
||||
|
||||
use base_db::salsa::Cycle;
|
||||
use chalk_ir::{AdtId, FloatTy, IntTy, TyKind, UintTy};
|
||||
use hir_def::{
|
||||
layout::{
|
||||
Abi, FieldsShape, Float, Integer, LayoutCalculator, LayoutS, Primitive, ReprOptions,
|
||||
Scalar, Size, StructKind, TargetDataLayout, WrappingRange,
|
||||
Abi, FieldsShape, Float, Integer, LayoutCalculator, LayoutCalculatorError, LayoutS,
|
||||
Primitive, ReprOptions, Scalar, Size, StructKind, TargetDataLayout, WrappingRange,
|
||||
},
|
||||
LocalFieldId, StructId,
|
||||
};
|
||||
|
@ -15,7 +15,6 @@ use la_arena::{Idx, RawIdx};
|
|||
use rustc_abi::AddressSpace;
|
||||
use rustc_index::{IndexSlice, IndexVec};
|
||||
|
||||
use stdx::never;
|
||||
use triomphe::Arc;
|
||||
|
||||
use crate::{
|
||||
|
@ -73,6 +72,7 @@ pub type Variants = hir_def::layout::Variants<RustcFieldIdx, RustcEnumVariantIdx
|
|||
|
||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||
pub enum LayoutError {
|
||||
EmptyUnion,
|
||||
HasErrorConst,
|
||||
HasErrorType,
|
||||
HasPlaceholder,
|
||||
|
@ -81,6 +81,7 @@ pub enum LayoutError {
|
|||
RecursiveTypeWithoutIndirection,
|
||||
SizeOverflow,
|
||||
TargetLayoutNotAvailable,
|
||||
UnexpectedUnsized,
|
||||
Unknown,
|
||||
UserReprTooSmall,
|
||||
}
|
||||
|
@ -89,6 +90,7 @@ impl std::error::Error for LayoutError {}
|
|||
impl fmt::Display for LayoutError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
LayoutError::EmptyUnion => write!(f, "type is an union with no fields"),
|
||||
LayoutError::HasErrorConst => write!(f, "type contains an unevaluatable const"),
|
||||
LayoutError::HasErrorType => write!(f, "type contains an error"),
|
||||
LayoutError::HasPlaceholder => write!(f, "type contains placeholders"),
|
||||
|
@ -99,6 +101,9 @@ impl fmt::Display for LayoutError {
|
|||
}
|
||||
LayoutError::SizeOverflow => write!(f, "size overflow"),
|
||||
LayoutError::TargetLayoutNotAvailable => write!(f, "target layout not available"),
|
||||
LayoutError::UnexpectedUnsized => {
|
||||
write!(f, "an unsized type was found where a sized type was expected")
|
||||
}
|
||||
LayoutError::Unknown => write!(f, "unknown"),
|
||||
LayoutError::UserReprTooSmall => {
|
||||
write!(f, "the `#[repr]` hint is too small to hold the discriminants of the enum")
|
||||
|
@ -107,19 +112,23 @@ impl fmt::Display for LayoutError {
|
|||
}
|
||||
}
|
||||
|
||||
struct LayoutCx<'a> {
|
||||
target: &'a TargetDataLayout,
|
||||
impl<F> From<LayoutCalculatorError<F>> for LayoutError {
|
||||
fn from(err: LayoutCalculatorError<F>) -> Self {
|
||||
match err {
|
||||
LayoutCalculatorError::EmptyUnion => LayoutError::EmptyUnion,
|
||||
LayoutCalculatorError::UnexpectedUnsized(_) => LayoutError::UnexpectedUnsized,
|
||||
LayoutCalculatorError::SizeOverflow => LayoutError::SizeOverflow,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> LayoutCalculator for LayoutCx<'a> {
|
||||
type TargetDataLayoutRef = &'a TargetDataLayout;
|
||||
struct LayoutCx<'a> {
|
||||
calc: LayoutCalculator<&'a TargetDataLayout>,
|
||||
}
|
||||
|
||||
fn delayed_bug(&self, txt: impl Into<Cow<'static, str>>) {
|
||||
never!("{}", txt.into());
|
||||
}
|
||||
|
||||
fn current_data_layout(&self) -> &'a TargetDataLayout {
|
||||
self.target
|
||||
impl<'a> LayoutCx<'a> {
|
||||
fn new(target: &'a TargetDataLayout) -> Self {
|
||||
Self { calc: LayoutCalculator::new(target) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,8 +214,8 @@ pub fn layout_of_ty_query(
|
|||
let Ok(target) = db.target_data_layout(krate) else {
|
||||
return Err(LayoutError::TargetLayoutNotAvailable);
|
||||
};
|
||||
let cx = LayoutCx { target: &target };
|
||||
let dl = cx.current_data_layout();
|
||||
let dl = &*target;
|
||||
let cx = LayoutCx::new(dl);
|
||||
let ty = normalize(db, trait_env.clone(), ty);
|
||||
let result = match ty.kind(Interner) {
|
||||
TyKind::Adt(AdtId(def), subst) => {
|
||||
|
@ -281,7 +290,7 @@ pub fn layout_of_ty_query(
|
|||
.collect::<Result<Vec<_>, _>>()?;
|
||||
let fields = fields.iter().map(|it| &**it).collect::<Vec<_>>();
|
||||
let fields = fields.iter().collect::<IndexVec<_, _>>();
|
||||
cx.univariant(dl, &fields, &ReprOptions::default(), kind).ok_or(LayoutError::Unknown)?
|
||||
cx.calc.univariant(&fields, &ReprOptions::default(), kind)?
|
||||
}
|
||||
TyKind::Array(element, count) => {
|
||||
let count = try_const_usize(db, count).ok_or(LayoutError::HasErrorConst)? as u64;
|
||||
|
@ -367,12 +376,12 @@ pub fn layout_of_ty_query(
|
|||
};
|
||||
|
||||
// Effectively a (ptr, meta) tuple.
|
||||
cx.scalar_pair(data_ptr, metadata)
|
||||
cx.calc.scalar_pair(data_ptr, metadata)
|
||||
}
|
||||
TyKind::FnDef(_, _) => layout_of_unit(&cx, dl)?,
|
||||
TyKind::Never => cx.layout_of_never_type(),
|
||||
TyKind::FnDef(_, _) => layout_of_unit(&cx)?,
|
||||
TyKind::Never => cx.calc.layout_of_never_type(),
|
||||
TyKind::Dyn(_) | TyKind::Foreign(_) => {
|
||||
let mut unit = layout_of_unit(&cx, dl)?;
|
||||
let mut unit = layout_of_unit(&cx)?;
|
||||
match &mut unit.abi {
|
||||
Abi::Aggregate { sized } => *sized = false,
|
||||
_ => return Err(LayoutError::Unknown),
|
||||
|
@ -414,8 +423,7 @@ pub fn layout_of_ty_query(
|
|||
.collect::<Result<Vec<_>, _>>()?;
|
||||
let fields = fields.iter().map(|it| &**it).collect::<Vec<_>>();
|
||||
let fields = fields.iter().collect::<IndexVec<_, _>>();
|
||||
cx.univariant(dl, &fields, &ReprOptions::default(), StructKind::AlwaysSized)
|
||||
.ok_or(LayoutError::Unknown)?
|
||||
cx.calc.univariant(&fields, &ReprOptions::default(), StructKind::AlwaysSized)?
|
||||
}
|
||||
TyKind::Coroutine(_, _) | TyKind::CoroutineWitness(_, _) => {
|
||||
return Err(LayoutError::NotImplemented)
|
||||
|
@ -447,14 +455,14 @@ pub fn layout_of_ty_recover(
|
|||
Err(LayoutError::RecursiveTypeWithoutIndirection)
|
||||
}
|
||||
|
||||
fn layout_of_unit(cx: &LayoutCx<'_>, dl: &TargetDataLayout) -> Result<Layout, LayoutError> {
|
||||
cx.univariant::<RustcFieldIdx, RustcEnumVariantIdx, &&Layout>(
|
||||
dl,
|
||||
IndexSlice::empty(),
|
||||
&ReprOptions::default(),
|
||||
StructKind::AlwaysSized,
|
||||
)
|
||||
.ok_or(LayoutError::Unknown)
|
||||
fn layout_of_unit(cx: &LayoutCx<'_>) -> Result<Layout, LayoutError> {
|
||||
cx.calc
|
||||
.univariant::<RustcFieldIdx, RustcEnumVariantIdx, &&Layout>(
|
||||
IndexSlice::empty(),
|
||||
&ReprOptions::default(),
|
||||
StructKind::AlwaysSized,
|
||||
)
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
fn struct_tail_erasing_lifetimes(db: &dyn HirDatabase, pointee: Ty) -> Ty {
|
||||
|
|
|
@ -5,7 +5,7 @@ use std::{cmp, ops::Bound};
|
|||
use base_db::salsa::Cycle;
|
||||
use hir_def::{
|
||||
data::adt::VariantData,
|
||||
layout::{Integer, LayoutCalculator, ReprOptions, TargetDataLayout},
|
||||
layout::{Integer, ReprOptions, TargetDataLayout},
|
||||
AdtId, VariantId,
|
||||
};
|
||||
use intern::sym;
|
||||
|
@ -36,8 +36,8 @@ pub fn layout_of_adt_query(
|
|||
let Ok(target) = db.target_data_layout(krate) else {
|
||||
return Err(LayoutError::TargetLayoutNotAvailable);
|
||||
};
|
||||
let cx = LayoutCx { target: &target };
|
||||
let dl = cx.current_data_layout();
|
||||
let dl = &*target;
|
||||
let cx = LayoutCx::new(dl);
|
||||
let handle_variant = |def: VariantId, var: &VariantData| {
|
||||
var.fields()
|
||||
.iter()
|
||||
|
@ -73,9 +73,9 @@ pub fn layout_of_adt_query(
|
|||
.collect::<SmallVec<[_; 1]>>();
|
||||
let variants = variants.iter().map(|it| it.iter().collect()).collect::<IndexVec<_, _>>();
|
||||
let result = if matches!(def, AdtId::UnionId(..)) {
|
||||
cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)?
|
||||
cx.calc.layout_of_union(&repr, &variants)?
|
||||
} else {
|
||||
cx.layout_of_struct_or_enum(
|
||||
cx.calc.layout_of_struct_or_enum(
|
||||
&repr,
|
||||
&variants,
|
||||
matches!(def, AdtId::EnumId(..)),
|
||||
|
@ -103,8 +103,7 @@ pub fn layout_of_adt_query(
|
|||
.next()
|
||||
.and_then(|it| it.iter().last().map(|it| !it.is_unsized()))
|
||||
.unwrap_or(true),
|
||||
)
|
||||
.ok_or(LayoutError::SizeOverflow)?
|
||||
)?
|
||||
};
|
||||
Ok(Arc::new(result))
|
||||
}
|
||||
|
|
|
@ -379,6 +379,7 @@ pub enum FnAbi {
|
|||
AvrNonBlockingInterrupt,
|
||||
C,
|
||||
CCmseNonsecureCall,
|
||||
CCmseNonsecureEntry,
|
||||
CDecl,
|
||||
CDeclUnwind,
|
||||
CUnwind,
|
||||
|
@ -436,6 +437,7 @@ impl FnAbi {
|
|||
s if *s == sym::avr_dash_interrupt => FnAbi::AvrInterrupt,
|
||||
s if *s == sym::avr_dash_non_dash_blocking_dash_interrupt => FnAbi::AvrNonBlockingInterrupt,
|
||||
s if *s == sym::C_dash_cmse_dash_nonsecure_dash_call => FnAbi::CCmseNonsecureCall,
|
||||
s if *s == sym::C_dash_cmse_dash_nonsecure_dash_entry => FnAbi::CCmseNonsecureEntry,
|
||||
s if *s == sym::C_dash_unwind => FnAbi::CUnwind,
|
||||
s if *s == sym::C => FnAbi::C,
|
||||
s if *s == sym::cdecl_dash_unwind => FnAbi::CDeclUnwind,
|
||||
|
@ -479,6 +481,7 @@ impl FnAbi {
|
|||
FnAbi::AvrNonBlockingInterrupt => "avr-non-blocking-interrupt",
|
||||
FnAbi::C => "C",
|
||||
FnAbi::CCmseNonsecureCall => "C-cmse-nonsecure-call",
|
||||
FnAbi::CCmseNonsecureEntry => "C-cmse-nonsecure-entry",
|
||||
FnAbi::CDecl => "C-decl",
|
||||
FnAbi::CDeclUnwind => "cdecl-unwind",
|
||||
FnAbi::CUnwind => "C-unwind",
|
||||
|
|
|
@ -32,6 +32,7 @@ const SUPPORTED_CALLING_CONVENTIONS: &[&str] = &[
|
|||
"riscv-interrupt-m",
|
||||
"riscv-interrupt-s",
|
||||
"C-cmse-nonsecure-call",
|
||||
"C-cmse-nonsecure-entry",
|
||||
"wasm",
|
||||
"system",
|
||||
"system-unwind",
|
||||
|
|
|
@ -94,6 +94,7 @@ define_symbols! {
|
|||
avr_dash_interrupt = "avr-interrupt",
|
||||
avr_dash_non_dash_blocking_dash_interrupt = "avr-non-blocking-interrupt",
|
||||
C_dash_cmse_dash_nonsecure_dash_call = "C-cmse-nonsecure-call",
|
||||
C_dash_cmse_dash_nonsecure_dash_entry = "C-cmse-nonsecure-entry",
|
||||
C_dash_unwind = "C-unwind",
|
||||
cdecl_dash_unwind = "cdecl-unwind",
|
||||
fastcall_dash_unwind = "fastcall-unwind",
|
||||
|
|
|
@ -198,6 +198,11 @@ impl<'a> Converter<'a> {
|
|||
}
|
||||
LIFETIME_IDENT
|
||||
}
|
||||
rustc_lexer::TokenKind::UnknownPrefixLifetime => {
|
||||
err = "Unknown lifetime prefix";
|
||||
LIFETIME_IDENT
|
||||
}
|
||||
rustc_lexer::TokenKind::RawLifetime => LIFETIME_IDENT,
|
||||
|
||||
rustc_lexer::TokenKind::Semi => T![;],
|
||||
rustc_lexer::TokenKind::Comma => T![,],
|
||||
|
|
|
@ -1 +1 @@
|
|||
6cf068db566de080dfa7ed24a216ea3aed2b98ce
|
||||
1b5aa96d6016bafe50e071b45d4d2e3c90fd766f
|
||||
|
|
Loading…
Reference in a new issue