Skip to content

Commit 11b401d

Browse files
committed
Auto merge of rust-lang#16447 - Veykril:mir-errors, r=Veykril
intenral: Cleanup error variants in MIR code a bit
2 parents 22b6f96 + 5860763 commit 11b401d

File tree

17 files changed

+598
-434
lines changed

17 files changed

+598
-434
lines changed

crates/hir-expand/src/proc_macro.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! Proc Macro Expander stub
1+
//! Proc Macro Expander stuff
22
33
use core::fmt;
44
use std::{panic::RefUnwindSafe, sync};

crates/hir-ty/src/db.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
118118
fn layout_of_ty(&self, ty: Ty, env: Arc<TraitEnvironment>) -> Result<Arc<Layout>, LayoutError>;
119119

120120
#[salsa::invoke(crate::layout::target_data_layout_query)]
121-
fn target_data_layout(&self, krate: CrateId) -> Option<Arc<TargetDataLayout>>;
121+
fn target_data_layout(&self, krate: CrateId) -> Result<Arc<TargetDataLayout>, Arc<str>>;
122122

123123
#[salsa::invoke(crate::method_resolution::lookup_impl_method_query)]
124124
fn lookup_impl_method(

crates/hir-ty/src/display.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -605,8 +605,11 @@ fn render_const_scalar(
605605
write!(f, "{}", f.db.union_data(u).name.display(f.db.upcast()))
606606
}
607607
hir_def::AdtId::EnumId(e) => {
608+
let Ok(target_data_layout) = f.db.target_data_layout(trait_env.krate) else {
609+
return f.write_str("<target-layout-not-available>");
610+
};
608611
let Some((var_id, var_layout)) =
609-
detect_variant_from_bytes(&layout, f.db, trait_env, b, e)
612+
detect_variant_from_bytes(&layout, f.db, &target_data_layout, b, e)
610613
else {
611614
return f.write_str("<failed-to-detect-variant>");
612615
};

crates/hir-ty/src/layout.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ pub fn layout_of_ty_query(
198198
trait_env: Arc<TraitEnvironment>,
199199
) -> Result<Arc<Layout>, LayoutError> {
200200
let krate = trait_env.krate;
201-
let Some(target) = db.target_data_layout(krate) else {
201+
let Ok(target) = db.target_data_layout(krate) else {
202202
return Err(LayoutError::TargetLayoutNotAvailable);
203203
};
204204
let cx = LayoutCx { target: &target };

crates/hir-ty/src/layout/adt.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub fn layout_of_adt_query(
3232
trait_env: Arc<TraitEnvironment>,
3333
) -> Result<Arc<Layout>, LayoutError> {
3434
let krate = trait_env.krate;
35-
let Some(target) = db.target_data_layout(krate) else {
35+
let Ok(target) = db.target_data_layout(krate) else {
3636
return Err(LayoutError::TargetLayoutNotAvailable);
3737
};
3838
let cx = LayoutCx { target: &target };

crates/hir-ty/src/layout/target.rs

+35-9
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,48 @@
22
33
use base_db::CrateId;
44
use hir_def::layout::TargetDataLayout;
5+
use ra_ap_rustc_abi::{AlignFromBytesError, TargetDataLayoutErrors};
56
use triomphe::Arc;
67

78
use crate::db::HirDatabase;
89

910
pub fn target_data_layout_query(
1011
db: &dyn HirDatabase,
1112
krate: CrateId,
12-
) -> Option<Arc<TargetDataLayout>> {
13+
) -> Result<Arc<TargetDataLayout>, Arc<str>> {
1314
let crate_graph = db.crate_graph();
14-
let target_layout = crate_graph[krate].target_layout.as_ref().ok()?;
15-
let res = TargetDataLayout::parse_from_llvm_datalayout_string(target_layout);
16-
if let Err(_e) = &res {
17-
// FIXME: Print the error here once it implements debug/display
18-
// also logging here is somewhat wrong, but unfortunately this is the earliest place we can
19-
// parse that doesn't impose a dependency to the rust-abi crate for project-model
20-
tracing::error!("Failed to parse target data layout for {krate:?}");
15+
let res = crate_graph[krate].target_layout.as_deref();
16+
match res {
17+
Ok(it) => match TargetDataLayout::parse_from_llvm_datalayout_string(it) {
18+
Ok(it) => Ok(Arc::new(it)),
19+
Err(e) => {
20+
Err(match e {
21+
TargetDataLayoutErrors::InvalidAddressSpace { addr_space, cause, err } => {
22+
format!(
23+
r#"invalid address space `{addr_space}` for `{cause}` in "data-layout": {err}"#
24+
)
25+
}
26+
TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => format!(r#"invalid {kind} `{bit}` for `{cause}` in "data-layout": {err}"#),
27+
TargetDataLayoutErrors::MissingAlignment { cause } => format!(r#"missing alignment for `{cause}` in "data-layout""#),
28+
TargetDataLayoutErrors::InvalidAlignment { cause, err } => format!(
29+
r#"invalid alignment for `{cause}` in "data-layout": `{align}` is {err_kind}"#,
30+
align = err.align(),
31+
err_kind = match err {
32+
AlignFromBytesError::NotPowerOfTwo(_) => "not a power of two",
33+
AlignFromBytesError::TooLarge(_) => "too large",
34+
}
35+
),
36+
TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
37+
format!(r#"inconsistent target specification: "data-layout" claims architecture is {dl}-endian, while "target-endian" is `{target}`"#)
38+
}
39+
TargetDataLayoutErrors::InconsistentTargetPointerWidth {
40+
pointer_size,
41+
target,
42+
} => format!(r#"inconsistent target specification: "data-layout" claims pointers are {pointer_size}-bit, while "target-pointer-width" is `{target}`"#),
43+
TargetDataLayoutErrors::InvalidBitsSize { err } => err,
44+
}.into())
45+
}
46+
},
47+
Err(e) => Err(Arc::from(&**e)),
2148
}
22-
res.ok().map(Arc::new)
2349
}

crates/hir-ty/src/mir/borrowck.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ fn mutability_of_locals(
444444
}
445445
if destination.projection.lookup(&body.projection_store).is_empty() {
446446
if ever_init_map.get(destination.local).copied().unwrap_or_default() {
447-
push_mut_span(destination.local, MirSpan::Unknown, &mut result);
447+
push_mut_span(destination.local, terminator.span, &mut result);
448448
} else {
449449
ever_init_map.insert(destination.local, true);
450450
}

0 commit comments

Comments
 (0)