Skip to content

Commit 0a0bb77

Browse files
committed
Auto merge of #15512 - HKalbasi:mir, r=HKalbasi
Update offset intrinsic to match 1.72 fix #15498
2 parents f5b7c60 + fa76f60 commit 0a0bb77

File tree

10 files changed

+136
-58
lines changed

10 files changed

+136
-58
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ jobs:
9898

9999
- name: Run analysis-stats on rust std library
100100
if: matrix.os == 'ubuntu-latest'
101-
run: target/${{ matrix.target }}/debug/rust-analyzer analysis-stats --with-deps $(rustc --print sysroot)/lib/rustlib/src/rust/library/std
101+
run: RUSTC_BOOTSTRAP=1 target/${{ matrix.target }}/debug/rust-analyzer analysis-stats --with-deps $(rustc --print sysroot)/lib/rustlib/src/rust/library/std
102102

103103
# Weird targets to catch non-portable code
104104
rust-cross:

crates/hir-def/src/nameres/collector.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1828,7 +1828,11 @@ impl ModCollector<'_, '_> {
18281828
let Some(paths) = attr.parse_path_comma_token_tree(db.upcast(), &hygiene) else {
18291829
// `#[macro_use]` (without any paths) found, forget collected names and just import
18301830
// all visible macros.
1831-
self.def_collector.import_macros_from_extern_crate(target_crate, None, Some(extern_crate_id));
1831+
self.def_collector.import_macros_from_extern_crate(
1832+
target_crate,
1833+
None,
1834+
Some(extern_crate_id),
1835+
);
18321836
return;
18331837
};
18341838
for path in paths {

crates/hir-expand/src/builtin_fn_macro.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ pub(crate) fn include_arg_to_tt(
692692
arg_id: MacroCallId,
693693
) -> Result<(triomphe::Arc<(::tt::Subtree<::tt::TokenId>, TokenMap)>, FileId), ExpandError> {
694694
let loc = db.lookup_intern_macro_call(arg_id);
695-
let Some(EagerCallInfo { arg,arg_id, .. }) = loc.eager.as_deref() else {
695+
let Some(EagerCallInfo { arg, arg_id, .. }) = loc.eager.as_deref() else {
696696
panic!("include_arg_to_tt called on non include macro call: {:?}", &loc.eager);
697697
};
698698
let path = parse_string(&arg.0)?;

crates/hir-expand/src/hygiene.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl HygieneFrame {
242242
krate,
243243
call_site: None,
244244
def_site: None,
245-
}
245+
};
246246
};
247247

248248
let def_site = info.attr_input_or_mac_def_start.map(|it| db.hygiene_frame(it.file_id));

crates/hir-ty/src/consteval/tests/intrinsics.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -499,24 +499,26 @@ fn offset() {
499499
r#"
500500
//- minicore: coerce_unsized, index, slice
501501
extern "rust-intrinsic" {
502-
pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
502+
pub fn offset<Ptr, Delta>(dst: Ptr, offset: Delta) -> Ptr;
503+
pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
503504
}
504505
505-
const GOAL: u8 = unsafe {
506-
let ar: &[(u8, u8, u8)] = &[
506+
const GOAL: i32 = unsafe {
507+
let ar: &[(i32, i32, i32)] = &[
507508
(10, 11, 12),
508509
(20, 21, 22),
509510
(30, 31, 32),
510511
(40, 41, 42),
511512
(50, 51, 52),
512513
];
513-
let ar: *const [(u8, u8, u8)] = ar;
514-
let ar = ar as *const (u8, u8, u8);
515-
let element = *offset(ar, 2);
516-
element.1
514+
let ar: *const [(i32, i32, i32)] = ar;
515+
let ar = ar as *const (i32, i32, i32);
516+
let element3 = *offset(ar, 2usize);
517+
let element4 = *arith_offset(ar, 3);
518+
element3.1 * 100 + element4.0
517519
};
518520
"#,
519-
31,
521+
3140,
520522
);
521523
}
522524

crates/hir-ty/src/infer/cast.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ impl CastCheck {
3939
}
4040

4141
fn check_ref_to_ptr_cast(expr_ty: Ty, cast_ty: Ty, table: &mut InferenceTable<'_>) -> bool {
42-
let Some((expr_inner_ty, _, _)) = expr_ty.as_reference() else { return false; };
43-
let Some((cast_inner_ty, _)) = cast_ty.as_raw_ptr() else { return false; };
44-
let TyKind::Array(expr_elt_ty, _) = expr_inner_ty.kind(Interner) else { return false; };
42+
let Some((expr_inner_ty, _, _)) = expr_ty.as_reference() else {
43+
return false;
44+
};
45+
let Some((cast_inner_ty, _)) = cast_ty.as_raw_ptr() else {
46+
return false;
47+
};
48+
let TyKind::Array(expr_elt_ty, _) = expr_inner_ty.kind(Interner) else {
49+
return false;
50+
};
4551
table.coerce(expr_elt_ty, cast_inner_ty).is_ok()
4652
}

crates/hir-ty/src/layout.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ fn layout_of_simd_ty(
109109
// * the homogeneous field type and the number of fields.
110110
let (e_ty, e_len, is_array) = if let TyKind::Array(e_ty, _) = f0_ty.kind(Interner) {
111111
// Extract the number of elements from the layout of the array field:
112-
let FieldsShape::Array { count, .. } = db.layout_of_ty(f0_ty.clone(), env.clone())?.fields else {
112+
let FieldsShape::Array { count, .. } = db.layout_of_ty(f0_ty.clone(), env.clone())?.fields
113+
else {
113114
user_error!("Array with non array layout");
114115
};
115116

crates/hir-ty/src/mir/eval/shim.rs

Lines changed: 97 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
use std::cmp;
55

66
use chalk_ir::TyKind;
7-
use hir_def::resolver::HasResolver;
7+
use hir_def::{
8+
builtin_type::{BuiltinInt, BuiltinUint},
9+
resolver::HasResolver,
10+
};
811
use hir_expand::mod_path::ModPath;
912

1013
use super::*;
@@ -300,21 +303,36 @@ impl Evaluator<'_> {
300303
BeginPanic => Err(MirEvalError::Panic("<unknown-panic-payload>".to_string())),
301304
PanicFmt => {
302305
let message = (|| {
303-
let resolver = self.db.crate_def_map(self.crate_id).crate_root().resolver(self.db.upcast());
306+
let resolver = self
307+
.db
308+
.crate_def_map(self.crate_id)
309+
.crate_root()
310+
.resolver(self.db.upcast());
304311
let Some(format_fn) = resolver.resolve_path_in_value_ns_fully(
305312
self.db.upcast(),
306-
&hir_def::path::Path::from_known_path_with_no_generic(ModPath::from_segments(
307-
hir_expand::mod_path::PathKind::Abs,
308-
[name![std], name![fmt], name![format]].into_iter(),
309-
)),
313+
&hir_def::path::Path::from_known_path_with_no_generic(
314+
ModPath::from_segments(
315+
hir_expand::mod_path::PathKind::Abs,
316+
[name![std], name![fmt], name![format]].into_iter(),
317+
),
318+
),
310319
) else {
311320
not_supported!("std::fmt::format not found");
312321
};
313-
let hir_def::resolver::ValueNs::FunctionId(format_fn) = format_fn else { not_supported!("std::fmt::format is not a function") };
314-
let message_string = self.interpret_mir(self.db.mir_body(format_fn.into()).map_err(|e| MirEvalError::MirLowerError(format_fn, e))?, args.map(|x| IntervalOrOwned::Owned(x.clone())))?;
315-
let addr = Address::from_bytes(&message_string[self.ptr_size()..2 * self.ptr_size()])?;
322+
let hir_def::resolver::ValueNs::FunctionId(format_fn) = format_fn else {
323+
not_supported!("std::fmt::format is not a function")
324+
};
325+
let message_string = self.interpret_mir(
326+
self.db
327+
.mir_body(format_fn.into())
328+
.map_err(|e| MirEvalError::MirLowerError(format_fn, e))?,
329+
args.map(|x| IntervalOrOwned::Owned(x.clone())),
330+
)?;
331+
let addr =
332+
Address::from_bytes(&message_string[self.ptr_size()..2 * self.ptr_size()])?;
316333
let size = from_bytes!(usize, message_string[2 * self.ptr_size()..]);
317-
Ok(std::string::String::from_utf8_lossy(self.read_memory(addr, size)?).into_owned())
334+
Ok(std::string::String::from_utf8_lossy(self.read_memory(addr, size)?)
335+
.into_owned())
318336
})()
319337
.unwrap_or_else(|e| format!("Failed to render panic format args: {e:?}"));
320338
Err(MirEvalError::Panic(message))
@@ -483,9 +501,7 @@ impl Evaluator<'_> {
483501
}
484502
"syscall" => {
485503
let Some((id, rest)) = args.split_first() else {
486-
return Err(MirEvalError::TypeError(
487-
"syscall arg1 is not provided",
488-
));
504+
return Err(MirEvalError::TypeError("syscall arg1 is not provided"));
489505
};
490506
let id = from_bytes!(i64, id.get(self)?);
491507
self.exec_syscall(id, rest, destination, locals, span)
@@ -710,22 +726,26 @@ impl Evaluator<'_> {
710726
}
711727
match name {
712728
"size_of" => {
713-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
729+
let Some(ty) =
730+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
714731
else {
715732
return Err(MirEvalError::TypeError("size_of generic arg is not provided"));
716733
};
717734
let size = self.size_of_sized(ty, locals, "size_of arg")?;
718735
destination.write_from_bytes(self, &size.to_le_bytes()[0..destination.size])
719736
}
720737
"min_align_of" | "pref_align_of" => {
721-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner)) else {
738+
let Some(ty) =
739+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
740+
else {
722741
return Err(MirEvalError::TypeError("align_of generic arg is not provided"));
723742
};
724743
let align = self.layout(ty)?.align.abi.bytes();
725744
destination.write_from_bytes(self, &align.to_le_bytes()[0..destination.size])
726745
}
727746
"size_of_val" => {
728-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
747+
let Some(ty) =
748+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
729749
else {
730750
return Err(MirEvalError::TypeError("size_of_val generic arg is not provided"));
731751
};
@@ -741,8 +761,12 @@ impl Evaluator<'_> {
741761
}
742762
}
743763
"min_align_of_val" => {
744-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner)) else {
745-
return Err(MirEvalError::TypeError("min_align_of_val generic arg is not provided"));
764+
let Some(ty) =
765+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
766+
else {
767+
return Err(MirEvalError::TypeError(
768+
"min_align_of_val generic arg is not provided",
769+
));
746770
};
747771
let [arg] = args else {
748772
return Err(MirEvalError::TypeError("min_align_of_val args are not provided"));
@@ -756,7 +780,8 @@ impl Evaluator<'_> {
756780
}
757781
}
758782
"type_name" => {
759-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
783+
let Some(ty) =
784+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
760785
else {
761786
return Err(MirEvalError::TypeError("type_name generic arg is not provided"));
762787
};
@@ -779,7 +804,8 @@ impl Evaluator<'_> {
779804
.write_from_bytes(self, &len.to_le_bytes())
780805
}
781806
"needs_drop" => {
782-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
807+
let Some(ty) =
808+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
783809
else {
784810
return Err(MirEvalError::TypeError("size_of generic arg is not provided"));
785811
};
@@ -831,9 +857,12 @@ impl Evaluator<'_> {
831857
let lhs = i128::from_le_bytes(pad16(lhs.get(self)?, false));
832858
let rhs = i128::from_le_bytes(pad16(rhs.get(self)?, false));
833859
let ans = lhs.wrapping_sub(rhs);
834-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
860+
let Some(ty) =
861+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
835862
else {
836-
return Err(MirEvalError::TypeError("ptr_offset_from generic arg is not provided"));
863+
return Err(MirEvalError::TypeError(
864+
"ptr_offset_from generic arg is not provided",
865+
));
837866
};
838867
let size = self.size_of_sized(ty, locals, "ptr_offset_from arg")? as i128;
839868
let ans = ans / size;
@@ -940,7 +969,8 @@ impl Evaluator<'_> {
940969
"copy_nonoverlapping args are not provided",
941970
));
942971
};
943-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
972+
let Some(ty) =
973+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
944974
else {
945975
return Err(MirEvalError::TypeError(
946976
"copy_nonoverlapping generic arg is not provided",
@@ -959,9 +989,45 @@ impl Evaluator<'_> {
959989
let [ptr, offset] = args else {
960990
return Err(MirEvalError::TypeError("offset args are not provided"));
961991
};
962-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
963-
else {
964-
return Err(MirEvalError::TypeError("offset generic arg is not provided"));
992+
let ty = if name == "offset" {
993+
let Some(ty0) =
994+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
995+
else {
996+
return Err(MirEvalError::TypeError("offset generic arg is not provided"));
997+
};
998+
let Some(ty1) =
999+
generic_args.as_slice(Interner).get(1).and_then(|it| it.ty(Interner))
1000+
else {
1001+
return Err(MirEvalError::TypeError("offset generic arg is not provided"));
1002+
};
1003+
if !matches!(
1004+
ty1.as_builtin(),
1005+
Some(
1006+
BuiltinType::Int(BuiltinInt::Isize)
1007+
| BuiltinType::Uint(BuiltinUint::Usize)
1008+
)
1009+
) {
1010+
return Err(MirEvalError::TypeError(
1011+
"offset generic arg is not usize or isize",
1012+
));
1013+
}
1014+
match ty0.as_raw_ptr() {
1015+
Some((ty, _)) => ty,
1016+
None => {
1017+
return Err(MirEvalError::TypeError(
1018+
"offset generic arg is not a raw pointer",
1019+
));
1020+
}
1021+
}
1022+
} else {
1023+
let Some(ty) =
1024+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
1025+
else {
1026+
return Err(MirEvalError::TypeError(
1027+
"arith_offset generic arg is not provided",
1028+
));
1029+
};
1030+
ty
9651031
};
9661032
let ptr = u128::from_le_bytes(pad16(ptr.get(self)?, false));
9671033
let offset = u128::from_le_bytes(pad16(offset.get(self)?, false));
@@ -1079,7 +1145,8 @@ impl Evaluator<'_> {
10791145
let [arg] = args else {
10801146
return Err(MirEvalError::TypeError("discriminant_value arg is not provided"));
10811147
};
1082-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
1148+
let Some(ty) =
1149+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
10831150
else {
10841151
return Err(MirEvalError::TypeError(
10851152
"discriminant_value generic arg is not provided",
@@ -1139,11 +1206,10 @@ impl Evaluator<'_> {
11391206
};
11401207
let count = from_bytes!(usize, count.get(self)?);
11411208
let val = from_bytes!(u8, val.get(self)?);
1142-
let Some(ty) = generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
1209+
let Some(ty) =
1210+
generic_args.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
11431211
else {
1144-
return Err(MirEvalError::TypeError(
1145-
"write_bytes generic arg is not provided",
1146-
));
1212+
return Err(MirEvalError::TypeError("write_bytes generic arg is not provided"));
11471213
};
11481214
let dst = Address::from_bytes(dst.get(self)?)?;
11491215
let size = self.size_of_sized(ty, locals, "copy_nonoverlapping ptr type")?;

crates/hir-ty/src/mir/eval/shim/simd.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ impl Evaluator<'_> {
4545
};
4646
match try_const_usize(self.db, len) {
4747
Some(len) => {
48-
let Some(ty) = subst.as_slice(Interner).get(0).and_then(|it| it.ty(Interner)) else {
48+
let Some(ty) =
49+
subst.as_slice(Interner).get(0).and_then(|it| it.ty(Interner))
50+
else {
4951
return Err(MirEvalError::TypeError("simd type with no ty param"));
5052
};
5153
Ok((len as usize, ty.clone()))

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,7 +1201,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
12011201
let Some(values) = elements
12021202
.iter()
12031203
.map(|it| {
1204-
let Some((o, c)) = self.lower_expr_to_some_operand(*it, current)? else {
1204+
let Some((o, c)) = self.lower_expr_to_some_operand(*it, current)?
1205+
else {
12051206
return Ok(None);
12061207
};
12071208
current = c;
@@ -1259,7 +1260,8 @@ impl<'ctx> MirLowerCtx<'ctx> {
12591260
*expr,
12601261
rhs.project(ProjectionElem::TupleOrClosureField(i)),
12611262
span,
1262-
)? else {
1263+
)?
1264+
else {
12631265
return Ok(None);
12641266
};
12651267
current = c;
@@ -1268,8 +1270,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
12681270
}
12691271
Expr::Underscore => Ok(Some(current)),
12701272
_ => {
1271-
let Some((lhs_place, current)) =
1272-
self.lower_expr_as_place(current, lhs, false)?
1273+
let Some((lhs_place, current)) = self.lower_expr_as_place(current, lhs, false)?
12731274
else {
12741275
return Ok(None);
12751276
};
@@ -1286,9 +1287,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
12861287
rhs: ExprId,
12871288
span: MirSpan,
12881289
) -> Result<Option<BasicBlockId>> {
1289-
let Some((rhs_op, current)) =
1290-
self.lower_expr_to_some_operand(rhs, current)?
1291-
else {
1290+
let Some((rhs_op, current)) = self.lower_expr_to_some_operand(rhs, current)? else {
12921291
return Ok(None);
12931292
};
12941293
if matches!(&self.body.exprs[lhs], Expr::Underscore) {
@@ -1303,9 +1302,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
13031302
self.push_assignment(current, temp.clone(), rhs_op.into(), span);
13041303
return self.lower_destructing_assignment(current, lhs, temp, span);
13051304
}
1306-
let Some((lhs_place, current)) =
1307-
self.lower_expr_as_place(current, lhs, false)?
1308-
else {
1305+
let Some((lhs_place, current)) = self.lower_expr_as_place(current, lhs, false)? else {
13091306
return Ok(None);
13101307
};
13111308
self.push_assignment(current, lhs_place, rhs_op.into(), span);

0 commit comments

Comments
 (0)