Skip to content

Commit f233323

Browse files
committed
Gracefully handle non-UTF-8 string slices when pretty printing
1 parent 25ad89e commit f233323

File tree

4 files changed

+47
-50
lines changed

4 files changed

+47
-50
lines changed

compiler/rustc_middle/src/ty/print/pretty.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1443,8 +1443,7 @@ pub trait PrettyPrinter<'tcx>:
14431443
// relocations (we have an active `str` reference here). We don't use this
14441444
// result to affect interpreter execution.
14451445
let slice = data.inspect_with_uninit_and_ptr_outside_interpreter(start..end);
1446-
let s = std::str::from_utf8(slice).expect("non utf8 str from miri");
1447-
p!(write("{:?}", s));
1446+
p!(write("{:?}", String::from_utf8_lossy(slice)));
14481447
Ok(self)
14491448
}
14501449
(ConstValue::ByRef { alloc, offset }, ty::Array(t, n)) if *t == u8_type => {

src/test/mir-opt/const_prop/invalid_constant.main.ConstProp.diff

+38-32
Original file line numberDiff line numberDiff line change
@@ -2,63 +2,69 @@
22
+ // MIR for `main` after ConstProp
33

44
fn main() -> () {
5-
let mut _0: (); // return place in scope 0 at $DIR/invalid_constant.rs:13:11: 13:11
6-
let _1: main::InvalidChar; // in scope 0 at $DIR/invalid_constant.rs:19:9: 19:22
7-
let mut _3: main::InvalidTag; // in scope 0 at $DIR/invalid_constant.rs:26:25: 26:46
8-
let mut _5: main::NoVariants; // in scope 0 at $DIR/invalid_constant.rs:33:35: 33:56
5+
let mut _0: (); // return place in scope 0 at $DIR/invalid_constant.rs:15:11: 15:11
6+
let _1: main::InvalidChar; // in scope 0 at $DIR/invalid_constant.rs:21:9: 21:22
7+
let mut _3: main::InvalidTag; // in scope 0 at $DIR/invalid_constant.rs:28:25: 28:46
8+
let mut _5: main::NoVariants; // in scope 0 at $DIR/invalid_constant.rs:35:35: 35:56
99
scope 1 {
10-
debug _invalid_char => _1; // in scope 1 at $DIR/invalid_constant.rs:19:9: 19:22
11-
let _2: [main::InvalidTag; 1]; // in scope 1 at $DIR/invalid_constant.rs:26:9: 26:21
10+
debug _invalid_char => _1; // in scope 1 at $DIR/invalid_constant.rs:21:9: 21:22
11+
let _2: [main::InvalidTag; 1]; // in scope 1 at $DIR/invalid_constant.rs:28:9: 28:21
1212
scope 2 {
13-
debug _invalid_tag => _2; // in scope 2 at $DIR/invalid_constant.rs:26:9: 26:21
14-
let _4: [main::NoVariants; 1]; // in scope 2 at $DIR/invalid_constant.rs:33:9: 33:31
13+
debug _invalid_tag => _2; // in scope 2 at $DIR/invalid_constant.rs:28:9: 28:21
14+
let _4: [main::NoVariants; 1]; // in scope 2 at $DIR/invalid_constant.rs:35:9: 35:31
1515
scope 3 {
16-
debug _enum_without_variants => _4; // in scope 3 at $DIR/invalid_constant.rs:33:9: 33:31
16+
debug _enum_without_variants => _4; // in scope 3 at $DIR/invalid_constant.rs:35:9: 35:31
17+
let _6: main::Str<"���">; // in scope 3 at $DIR/invalid_constant.rs:39:9: 39:22
18+
scope 4 {
19+
debug _non_utf8_str => _6; // in scope 4 at $DIR/invalid_constant.rs:39:9: 39:22
20+
}
1721
}
1822
}
1923
}
2024

2125
bb0: {
22-
StorageLive(_1); // scope 0 at $DIR/invalid_constant.rs:19:9: 19:22
23-
- _1 = const { InvalidChar { int: 0x110001 } }; // scope 0 at $DIR/invalid_constant.rs:19:25: 19:64
24-
+ _1 = const InvalidChar { int: 1114113_u32, chr: {transmute(0x00110001): char} }; // scope 0 at $DIR/invalid_constant.rs:19:25: 19:64
26+
StorageLive(_1); // scope 0 at $DIR/invalid_constant.rs:21:9: 21:22
27+
- _1 = const { InvalidChar { int: 0x110001 } }; // scope 0 at $DIR/invalid_constant.rs:21:25: 21:64
28+
+ _1 = const InvalidChar { int: 1114113_u32, chr: {transmute(0x00110001): char} }; // scope 0 at $DIR/invalid_constant.rs:21:25: 21:64
2529
// ty::Const
2630
// + ty: main::InvalidChar
2731
- // + val: Unevaluated(main::{constant#0}, [main::InvalidChar], None)
2832
+ // + val: Value(Scalar(0x00110001))
2933
// mir::Constant
30-
// + span: $DIR/invalid_constant.rs:19:25: 19:64
34+
// + span: $DIR/invalid_constant.rs:21:25: 21:64
3135
- // + literal: Const { ty: main::InvalidChar, val: Unevaluated(Unevaluated { def: WithOptConstParam { did: DefId(0:7 ~ invalid_constant[726d]::main::{constant#0}), const_param_did: None }, substs: [main::InvalidChar], promoted: None }) }
3236
+ // + literal: Const { ty: main::InvalidChar, val: Value(Scalar(0x00110001)) }
33-
StorageLive(_2); // scope 1 at $DIR/invalid_constant.rs:26:9: 26:21
34-
StorageLive(_3); // scope 1 at $DIR/invalid_constant.rs:26:25: 26:46
35-
(_3.0: u32) = const 4_u32; // scope 1 at $DIR/invalid_constant.rs:26:25: 26:46
36-
- _2 = [move _3]; // scope 1 at $DIR/invalid_constant.rs:26:24: 26:47
37-
+ _2 = [const InvalidTag { int: 4_u32, e: Scalar(0x00000004): E }]; // scope 1 at $DIR/invalid_constant.rs:26:24: 26:47
37+
StorageLive(_2); // scope 1 at $DIR/invalid_constant.rs:28:9: 28:21
38+
StorageLive(_3); // scope 1 at $DIR/invalid_constant.rs:28:25: 28:46
39+
(_3.0: u32) = const 4_u32; // scope 1 at $DIR/invalid_constant.rs:28:25: 28:46
40+
- _2 = [move _3]; // scope 1 at $DIR/invalid_constant.rs:28:24: 28:47
41+
+ _2 = [const InvalidTag { int: 4_u32, e: Scalar(0x00000004): E }]; // scope 1 at $DIR/invalid_constant.rs:28:24: 28:47
3842
+ // ty::Const
3943
+ // + ty: main::InvalidTag
4044
+ // + val: Value(Scalar(0x00000004))
4145
+ // mir::Constant
42-
+ // + span: $DIR/invalid_constant.rs:26:24: 26:47
46+
+ // + span: $DIR/invalid_constant.rs:28:24: 28:47
4347
+ // + literal: Const { ty: main::InvalidTag, val: Value(Scalar(0x00000004)) }
44-
StorageDead(_3); // scope 1 at $DIR/invalid_constant.rs:26:46: 26:47
45-
StorageLive(_4); // scope 2 at $DIR/invalid_constant.rs:33:9: 33:31
46-
StorageLive(_5); // scope 2 at $DIR/invalid_constant.rs:33:35: 33:56
47-
(_5.0: u32) = const 0_u32; // scope 2 at $DIR/invalid_constant.rs:33:35: 33:56
48-
- _4 = [move _5]; // scope 2 at $DIR/invalid_constant.rs:33:34: 33:57
49-
+ _4 = [const NoVariants { int: 0_u32, empty: Scalar(<ZST>): Empty }]; // scope 2 at $DIR/invalid_constant.rs:33:34: 33:57
48+
StorageDead(_3); // scope 1 at $DIR/invalid_constant.rs:28:46: 28:47
49+
StorageLive(_4); // scope 2 at $DIR/invalid_constant.rs:35:9: 35:31
50+
StorageLive(_5); // scope 2 at $DIR/invalid_constant.rs:35:35: 35:56
51+
(_5.0: u32) = const 0_u32; // scope 2 at $DIR/invalid_constant.rs:35:35: 35:56
52+
- _4 = [move _5]; // scope 2 at $DIR/invalid_constant.rs:35:34: 35:57
53+
+ _4 = [const NoVariants { int: 0_u32, empty: Scalar(<ZST>): Empty }]; // scope 2 at $DIR/invalid_constant.rs:35:34: 35:57
5054
+ // ty::Const
5155
+ // + ty: main::NoVariants
5256
+ // + val: Value(Scalar(0x00000000))
5357
+ // mir::Constant
54-
+ // + span: $DIR/invalid_constant.rs:33:34: 33:57
58+
+ // + span: $DIR/invalid_constant.rs:35:34: 35:57
5559
+ // + literal: Const { ty: main::NoVariants, val: Value(Scalar(0x00000000)) }
56-
StorageDead(_5); // scope 2 at $DIR/invalid_constant.rs:33:56: 33:57
57-
nop; // scope 0 at $DIR/invalid_constant.rs:13:11: 34:2
58-
StorageDead(_4); // scope 2 at $DIR/invalid_constant.rs:34:1: 34:2
59-
StorageDead(_2); // scope 1 at $DIR/invalid_constant.rs:34:1: 34:2
60-
StorageDead(_1); // scope 0 at $DIR/invalid_constant.rs:34:1: 34:2
61-
return; // scope 0 at $DIR/invalid_constant.rs:34:2: 34:2
60+
StorageDead(_5); // scope 2 at $DIR/invalid_constant.rs:35:56: 35:57
61+
StorageLive(_6); // scope 3 at $DIR/invalid_constant.rs:39:9: 39:22
62+
nop; // scope 0 at $DIR/invalid_constant.rs:15:11: 42:2
63+
StorageDead(_6); // scope 3 at $DIR/invalid_constant.rs:42:1: 42:2
64+
StorageDead(_4); // scope 2 at $DIR/invalid_constant.rs:42:1: 42:2
65+
StorageDead(_2); // scope 1 at $DIR/invalid_constant.rs:42:1: 42:2
66+
StorageDead(_1); // scope 0 at $DIR/invalid_constant.rs:42:1: 42:2
67+
return; // scope 0 at $DIR/invalid_constant.rs:42:2: 42:2
6268
}
6369
}
6470

src/test/mir-opt/const_prop/invalid_constant.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Verify that we can pretty print invalid constants.
22

3+
#![feature(adt_const_params)]
34
#![feature(inline_const)]
5+
#![allow(incomplete_features)]
46

57
#[derive(Copy, Clone)]
68
#[repr(u32)]
@@ -31,4 +33,10 @@ fn main() {
3133
empty: Empty,
3234
}
3335
let _enum_without_variants = [NoVariants { int: 0 }];
36+
37+
// A non-UTF-8 string slice. Regression test for #75763 and #78520.
38+
struct Str<const S: &'static str>;
39+
let _non_utf8_str: Str::<{
40+
unsafe { std::mem::transmute::<&[u8], &str>(&[0xC0, 0xC1, 0xF5]) }
41+
}>;
3442
}

src/test/ui/const-generics/issues/issue-75763.rs

-16
This file was deleted.

0 commit comments

Comments
 (0)