@@ -5,7 +5,7 @@ use test_utils::skip_slow_tests;
5
5
6
6
use crate :: {
7
7
consteval:: try_const_usize, db:: HirDatabase , mir:: pad16, test_db:: TestDB , Const , ConstScalar ,
8
- Interner ,
8
+ Interner , MemoryMap ,
9
9
} ;
10
10
11
11
use super :: {
@@ -37,7 +37,7 @@ fn check_fail(ra_fixture: &str, error: impl FnOnce(ConstEvalError) -> bool) {
37
37
38
38
#[ track_caller]
39
39
fn check_number ( ra_fixture : & str , answer : i128 ) {
40
- check_answer ( ra_fixture, |b| {
40
+ check_answer ( ra_fixture, |b, _ | {
41
41
assert_eq ! (
42
42
b,
43
43
& answer. to_le_bytes( ) [ 0 ..b. len( ) ] ,
@@ -48,8 +48,26 @@ fn check_number(ra_fixture: &str, answer: i128) {
48
48
}
49
49
50
50
#[ track_caller]
51
- fn check_answer ( ra_fixture : & str , check : impl FnOnce ( & [ u8 ] ) ) {
52
- let ( db, file_id) = TestDB :: with_single_file ( ra_fixture) ;
51
+ fn check_str ( ra_fixture : & str , answer : & str ) {
52
+ check_answer ( ra_fixture, |b, mm| {
53
+ let addr = usize:: from_le_bytes ( b[ 0 ..b. len ( ) / 2 ] . try_into ( ) . unwrap ( ) ) ;
54
+ let size = usize:: from_le_bytes ( b[ b. len ( ) / 2 ..] . try_into ( ) . unwrap ( ) ) ;
55
+ let Some ( bytes) = mm. get ( addr, size) else {
56
+ panic ! ( "string data missed in the memory map" ) ;
57
+ } ;
58
+ assert_eq ! (
59
+ bytes,
60
+ answer. as_bytes( ) ,
61
+ "Bytes differ. In string form: actual = {}, expected = {answer}" ,
62
+ String :: from_utf8_lossy( bytes)
63
+ ) ;
64
+ } ) ;
65
+ }
66
+
67
+ #[ track_caller]
68
+ fn check_answer ( ra_fixture : & str , check : impl FnOnce ( & [ u8 ] , & MemoryMap ) ) {
69
+ let ( db, file_ids) = TestDB :: with_many_files ( ra_fixture) ;
70
+ let file_id = * file_ids. last ( ) . unwrap ( ) ;
53
71
let r = match eval_goal ( & db, file_id) {
54
72
Ok ( t) => t,
55
73
Err ( e) => {
@@ -59,8 +77,8 @@ fn check_answer(ra_fixture: &str, check: impl FnOnce(&[u8])) {
59
77
} ;
60
78
match & r. data ( Interner ) . value {
61
79
chalk_ir:: ConstValue :: Concrete ( c) => match & c. interned {
62
- ConstScalar :: Bytes ( b, _ ) => {
63
- check ( b) ;
80
+ ConstScalar :: Bytes ( b, mm ) => {
81
+ check ( b, mm ) ;
64
82
}
65
83
x => panic ! ( "Expected number but found {:?}" , x) ,
66
84
} ,
@@ -225,7 +243,7 @@ const GOAL: usize = {
225
243
transmute(&x)
226
244
}
227
245
"# ,
228
- |b| assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
246
+ |b, _ | assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
229
247
) ;
230
248
check_answer (
231
249
r#"
@@ -234,7 +252,7 @@ use core::mem::transmute;
234
252
static X: i64 = 12;
235
253
const GOAL: usize = transmute(&X);
236
254
"# ,
237
- |b| assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
255
+ |b, _ | assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
238
256
) ;
239
257
}
240
258
@@ -2068,6 +2086,17 @@ fn array_and_index() {
2068
2086
) ;
2069
2087
}
2070
2088
2089
+ #[ test]
2090
+ fn string ( ) {
2091
+ check_str (
2092
+ r#"
2093
+ //- minicore: coerce_unsized, index, slice
2094
+ const GOAL: &str = "hello";
2095
+ "# ,
2096
+ "hello" ,
2097
+ ) ;
2098
+ }
2099
+
2071
2100
#[ test]
2072
2101
fn byte_string ( ) {
2073
2102
check_number (
@@ -2444,6 +2473,25 @@ fn const_trait_assoc() {
2444
2473
"# ,
2445
2474
32 ,
2446
2475
) ;
2476
+ check_number (
2477
+ r#"
2478
+ //- /a/lib.rs crate:a
2479
+ pub trait ToConst {
2480
+ const VAL: usize;
2481
+ }
2482
+ pub const fn to_const<T: ToConst>() -> usize {
2483
+ T::VAL
2484
+ }
2485
+ //- /main.rs crate:main deps:a
2486
+ use a::{ToConst, to_const};
2487
+ struct U0;
2488
+ impl ToConst for U0 {
2489
+ const VAL: usize = 5;
2490
+ }
2491
+ const GOAL: usize = to_const::<U0>();
2492
+ "# ,
2493
+ 5 ,
2494
+ ) ;
2447
2495
check_number (
2448
2496
r#"
2449
2497
struct S<T>(*mut T);
0 commit comments