@@ -5,7 +5,7 @@ use test_utils::skip_slow_tests;
55
66use crate :: {
77 consteval:: try_const_usize, db:: HirDatabase , mir:: pad16, test_db:: TestDB , Const , ConstScalar ,
8- Interner ,
8+ Interner , MemoryMap ,
99} ;
1010
1111use super :: {
@@ -37,7 +37,7 @@ fn check_fail(ra_fixture: &str, error: impl FnOnce(ConstEvalError) -> bool) {
3737
3838#[ track_caller]
3939fn check_number ( ra_fixture : & str , answer : i128 ) {
40- check_answer ( ra_fixture, |b| {
40+ check_answer ( ra_fixture, |b, _ | {
4141 assert_eq ! (
4242 b,
4343 & answer. to_le_bytes( ) [ 0 ..b. len( ) ] ,
@@ -48,8 +48,26 @@ fn check_number(ra_fixture: &str, answer: i128) {
4848}
4949
5050#[ 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 ( ) ;
5371 let r = match eval_goal ( & db, file_id) {
5472 Ok ( t) => t,
5573 Err ( e) => {
@@ -59,8 +77,8 @@ fn check_answer(ra_fixture: &str, check: impl FnOnce(&[u8])) {
5977 } ;
6078 match & r. data ( Interner ) . value {
6179 chalk_ir:: ConstValue :: Concrete ( c) => match & c. interned {
62- ConstScalar :: Bytes ( b, _ ) => {
63- check ( b) ;
80+ ConstScalar :: Bytes ( b, mm ) => {
81+ check ( b, mm ) ;
6482 }
6583 x => panic ! ( "Expected number but found {:?}" , x) ,
6684 } ,
@@ -225,7 +243,7 @@ const GOAL: usize = {
225243 transmute(&x)
226244}
227245 "# ,
228- |b| assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
246+ |b, _ | assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
229247 ) ;
230248 check_answer (
231249 r#"
@@ -234,7 +252,7 @@ use core::mem::transmute;
234252static X: i64 = 12;
235253const GOAL: usize = transmute(&X);
236254 "# ,
237- |b| assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
255+ |b, _ | assert_eq ! ( b[ 0 ] % 8 , 0 ) ,
238256 ) ;
239257}
240258
@@ -2068,6 +2086,17 @@ fn array_and_index() {
20682086 ) ;
20692087}
20702088
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+
20712100#[ test]
20722101fn byte_string ( ) {
20732102 check_number (
@@ -2444,6 +2473,25 @@ fn const_trait_assoc() {
24442473 "# ,
24452474 32 ,
24462475 ) ;
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+ ) ;
24472495 check_number (
24482496 r#"
24492497 struct S<T>(*mut T);
0 commit comments