@@ -26,80 +26,74 @@ pub fn layout_of_adt_query<'db>(
26
26
args : GenericArgs < ' db > ,
27
27
trait_env : Arc < TraitEnvironment > ,
28
28
) -> Result < Arc < Layout > , LayoutError > {
29
- crate :: next_solver:: tls:: with_db ( db, || {
30
- let krate = trait_env. krate ;
31
- let Ok ( target) = db. target_data_layout ( krate) else {
32
- return Err ( LayoutError :: TargetLayoutNotAvailable ) ;
33
- } ;
34
- let dl = & * target;
35
- let cx = LayoutCx :: new ( dl) ;
36
- let handle_variant = |def : VariantId , var : & VariantFields | {
37
- var. fields ( )
29
+ let krate = trait_env. krate ;
30
+ let Ok ( target) = db. target_data_layout ( krate) else {
31
+ return Err ( LayoutError :: TargetLayoutNotAvailable ) ;
32
+ } ;
33
+ let dl = & * target;
34
+ let cx = LayoutCx :: new ( dl) ;
35
+ let handle_variant = |def : VariantId , var : & VariantFields | {
36
+ var. fields ( )
37
+ . iter ( )
38
+ . map ( |( fd, _) | layout_of_ty_query ( db, field_ty ( db, def, fd, & args) , trait_env. clone ( ) ) )
39
+ . collect :: < Result < Vec < _ > , _ > > ( )
40
+ } ;
41
+ let ( variants, repr, is_special_no_niche) = match def {
42
+ AdtId :: StructId ( s) => {
43
+ let data = db. struct_signature ( s) ;
44
+ let mut r = SmallVec :: < [ _ ; 1 ] > :: new ( ) ;
45
+ r. push ( handle_variant ( s. into ( ) , s. fields ( db) ) ?) ;
46
+ (
47
+ r,
48
+ data. repr . unwrap_or_default ( ) ,
49
+ data. flags . intersects ( StructFlags :: IS_UNSAFE_CELL | StructFlags :: IS_UNSAFE_PINNED ) ,
50
+ )
51
+ }
52
+ AdtId :: UnionId ( id) => {
53
+ let data = db. union_signature ( id) ;
54
+ let mut r = SmallVec :: new ( ) ;
55
+ r. push ( handle_variant ( id. into ( ) , id. fields ( db) ) ?) ;
56
+ ( r, data. repr . unwrap_or_default ( ) , false )
57
+ }
58
+ AdtId :: EnumId ( e) => {
59
+ let variants = e. enum_variants ( db) ;
60
+ let r = variants
61
+ . variants
38
62
. iter ( )
39
- . map ( |( fd , _) | {
40
- layout_of_ty_query ( db , field_ty ( db , def , fd , & args ) , trait_env . clone ( ) )
41
- } )
42
- . collect :: < Result < Vec < _ > , _ > > ( )
43
- } ;
44
- let ( variants, repr , is_special_no_niche ) = match def {
45
- AdtId :: StructId ( s ) => {
46
- let data = db . struct_signature ( s ) ;
47
- let mut r = SmallVec :: < [ _ ; 1 ] > :: new ( ) ;
48
- r . push ( handle_variant ( s . into ( ) , s . fields ( db ) ) ? ) ;
49
- (
50
- r ,
51
- data . repr . unwrap_or_default ( ) ,
52
- data . flags
53
- . intersects ( StructFlags :: IS_UNSAFE_CELL | StructFlags :: IS_UNSAFE_PINNED ) ,
54
- )
55
- }
56
- AdtId :: UnionId ( id ) => {
57
- let data = db . union_signature ( id ) ;
58
- let mut r = SmallVec :: new ( ) ;
59
- r . push ( handle_variant ( id . into ( ) , id . fields ( db ) ) ? ) ;
60
- ( r , data . repr . unwrap_or_default ( ) , false )
61
- }
62
- AdtId :: EnumId ( e ) => {
63
- let variants = e . enum_variants ( db ) ;
64
- let r = variants
65
- . variants
63
+ . map ( |& ( v , _, _ ) | handle_variant ( v . into ( ) , v . fields ( db ) ) )
64
+ . collect :: < Result < SmallVec < _ > , _ > > ( ) ? ;
65
+ ( r , db . enum_signature ( e ) . repr . unwrap_or_default ( ) , false )
66
+ }
67
+ } ;
68
+ let variants = variants
69
+ . iter ( )
70
+ . map ( |it| it . iter ( ) . map ( |it| & * * it ) . collect :: < Vec < _ > > ( ) )
71
+ . collect :: < SmallVec < [ _ ; 1 ] > > ( ) ;
72
+ let variants = variants . iter ( ) . map ( |it| it . iter ( ) . collect ( ) ) . collect :: < IndexVec < _ , _ > > ( ) ;
73
+ let result = if matches ! ( def , AdtId :: UnionId ( .. ) ) {
74
+ cx . calc . layout_of_union ( & repr , & variants ) ?
75
+ } else {
76
+ cx . calc . layout_of_struct_or_enum (
77
+ & repr ,
78
+ & variants ,
79
+ matches ! ( def , AdtId :: EnumId ( .. ) ) ,
80
+ is_special_no_niche ,
81
+ layout_scalar_valid_range ( db , def ) ,
82
+ |min , max| repr_discr ( dl , & repr , min , max ) . unwrap_or ( ( Integer :: I8 , false ) ) ,
83
+ variants . iter_enumerated ( ) . filter_map ( | ( id , _ ) | {
84
+ let AdtId :: EnumId ( e ) = def else { return None } ;
85
+ let d = db . const_eval_discriminant ( e . enum_variants ( db ) . variants [ id . 0 ] . 0 ) . ok ( ) ? ;
86
+ Some ( ( id , d ) )
87
+ } ) ,
88
+ ! matches ! ( def , AdtId :: EnumId ( .. ) )
89
+ && variants
66
90
. iter ( )
67
- . map ( |& ( v, _, _) | handle_variant ( v. into ( ) , v.fields ( db) ) )
68
- . collect :: < Result < SmallVec < _ > , _ > > ( ) ?;
69
- ( r, db. enum_signature ( e) . repr . unwrap_or_default ( ) , false )
70
- }
71
- } ;
72
- let variants = variants
73
- . iter ( )
74
- . map ( |it| it. iter ( ) . map ( |it| & * * it) . collect :: < Vec < _ > > ( ) )
75
- . collect :: < SmallVec < [ _ ; 1 ] > > ( ) ;
76
- let variants = variants. iter ( ) . map ( |it| it. iter ( ) . collect ( ) ) . collect :: < IndexVec < _ , _ > > ( ) ;
77
- let result = if matches ! ( def, AdtId :: UnionId ( ..) ) {
78
- cx. calc . layout_of_union ( & repr, & variants) ?
79
- } else {
80
- cx. calc . layout_of_struct_or_enum (
81
- & repr,
82
- & variants,
83
- matches ! ( def, AdtId :: EnumId ( ..) ) ,
84
- is_special_no_niche,
85
- layout_scalar_valid_range ( db, def) ,
86
- |min, max| repr_discr ( dl, & repr, min, max) . unwrap_or ( ( Integer :: I8 , false ) ) ,
87
- variants. iter_enumerated ( ) . filter_map ( |( id, _) | {
88
- let AdtId :: EnumId ( e) = def else { return None } ;
89
- let d =
90
- db. const_eval_discriminant ( e. enum_variants ( db) . variants [ id. 0 ] . 0 ) . ok ( ) ?;
91
- Some ( ( id, d) )
92
- } ) ,
93
- !matches ! ( def, AdtId :: EnumId ( ..) )
94
- && variants
95
- . iter ( )
96
- . next ( )
97
- . and_then ( |it| it. iter ( ) . last ( ) . map ( |it| !it. is_unsized ( ) ) )
98
- . unwrap_or ( true ) ,
99
- ) ?
100
- } ;
101
- Ok ( Arc :: new ( result) )
102
- } )
91
+ . next ( )
92
+ . and_then ( |it| it. iter ( ) . last ( ) . map ( |it| !it. is_unsized ( ) ) )
93
+ . unwrap_or ( true ) ,
94
+ ) ?
95
+ } ;
96
+ Ok ( Arc :: new ( result) )
103
97
}
104
98
105
99
pub ( crate ) fn layout_of_adt_cycle_result < ' db > (
0 commit comments