File tree 2 files changed +45
-0
lines changed
2 files changed +45
-0
lines changed Original file line number Diff line number Diff line change
1
+ //@ run-pass
2
+ //! Check that we can codegen setting and getting discriminants, including non-null niches,
3
+ //! for enums with a pointer-like ABI. This used to crash llvm.
4
+
5
+ #![ feature( rustc_attrs) ]
6
+ use std:: { ptr, mem} ;
7
+
8
+
9
+ #[ rustc_layout_scalar_valid_range_start( 1 ) ]
10
+ #[ rustc_layout_scalar_valid_range_end( 100 ) ]
11
+ #[ derive( Copy , Clone ) ]
12
+ struct PointerWithRange ( #[ allow( dead_code) ] * const u8 ) ;
13
+
14
+
15
+ fn main ( ) {
16
+ let val = unsafe { PointerWithRange ( ptr:: without_provenance ( 90 ) ) } ;
17
+
18
+ let ptr = Some ( val) ;
19
+ assert ! ( ptr. is_some( ) ) ;
20
+ let raw = unsafe { mem:: transmute :: < _ , usize > ( ptr) } ;
21
+ assert_eq ! ( raw, 90 ) ;
22
+
23
+ let ptr = Some ( Some ( val) ) ;
24
+ assert ! ( ptr. is_some( ) ) ;
25
+ assert ! ( ptr. unwrap( ) . is_some( ) ) ;
26
+ let raw = unsafe { mem:: transmute :: < _ , usize > ( ptr) } ;
27
+ assert_eq ! ( raw, 90 ) ;
28
+
29
+ let ptr: Option < PointerWithRange > = None ;
30
+ assert ! ( ptr. is_none( ) ) ;
31
+ let raw = unsafe { mem:: transmute :: < _ , usize > ( ptr) } ;
32
+ assert ! ( !( 1 ..=100 ) . contains( & raw) ) ;
33
+
34
+ let ptr: Option < Option < PointerWithRange > > = None ;
35
+ assert ! ( ptr. is_none( ) ) ;
36
+ let raw = unsafe { mem:: transmute :: < _ , usize > ( ptr) } ;
37
+ assert ! ( !( 1 ..=100 ) . contains( & raw) ) ;
38
+ }
Original file line number Diff line number Diff line change 5
5
#![ allow( dead_code) ]
6
6
#![ feature( never_type) ]
7
7
#![ feature( pointer_is_aligned_to) ]
8
+ #![ feature( rustc_attrs) ]
8
9
9
10
use std:: mem:: size_of;
10
11
use std:: num:: NonZero ;
@@ -237,6 +238,10 @@ struct VecDummy {
237
238
len : usize ,
238
239
}
239
240
241
+ #[ rustc_layout_scalar_valid_range_start( 1 ) ]
242
+ #[ rustc_layout_scalar_valid_range_end( 100 ) ]
243
+ struct PointerWithRange ( #[ allow( dead_code) ] * const u8 ) ;
244
+
240
245
pub fn main ( ) {
241
246
assert_eq ! ( size_of:: <u8 >( ) , 1 as usize ) ;
242
247
assert_eq ! ( size_of:: <u32 >( ) , 4 as usize ) ;
@@ -354,4 +359,6 @@ pub fn main() {
354
359
assert ! ( ptr:: from_ref( & v. a) . addr( ) > ptr:: from_ref( & v. b) . addr( ) ) ;
355
360
356
361
362
+ assert_eq ! ( size_of:: <Option <PointerWithRange >>( ) , size_of:: <PointerWithRange >( ) ) ;
363
+ assert_eq ! ( size_of:: <Option <Option <PointerWithRange >>>( ) , size_of:: <PointerWithRange >( ) ) ;
357
364
}
You can’t perform that action at this time.
0 commit comments