@@ -5,7 +5,7 @@ use std::{cmp, ops::Bound};
5
5
use hir_def:: {
6
6
AdtId , VariantId ,
7
7
layout:: { Integer , ReprOptions , TargetDataLayout } ,
8
- signatures:: VariantFields ,
8
+ signatures:: { StructFlags , VariantFields } ,
9
9
} ;
10
10
use intern:: sym;
11
11
use rustc_index:: IndexVec ;
@@ -16,7 +16,6 @@ use triomphe::Arc;
16
16
use crate :: {
17
17
Substitution , TraitEnvironment ,
18
18
db:: HirDatabase ,
19
- lang_items:: is_unsafe_cell,
20
19
layout:: { Layout , LayoutError , field_ty} ,
21
20
} ;
22
21
@@ -40,18 +39,22 @@ pub fn layout_of_adt_query(
40
39
. map ( |( fd, _) | db. layout_of_ty ( field_ty ( db, def, fd, & subst) , trait_env. clone ( ) ) )
41
40
. collect :: < Result < Vec < _ > , _ > > ( )
42
41
} ;
43
- let ( variants, repr) = match def {
42
+ let ( variants, repr, is_special_no_niche ) = match def {
44
43
AdtId :: StructId ( s) => {
45
- let data = db. struct_signature ( s) ;
44
+ let sig = db. struct_signature ( s) ;
46
45
let mut r = SmallVec :: < [ _ ; 1 ] > :: new ( ) ;
47
46
r. push ( handle_variant ( s. into ( ) , & db. variant_fields ( s. into ( ) ) ) ?) ;
48
- ( r, data. repr . unwrap_or_default ( ) )
47
+ (
48
+ r,
49
+ sig. repr . unwrap_or_default ( ) ,
50
+ sig. flags . intersects ( StructFlags :: IS_UNSAFE_CELL | StructFlags :: IS_UNSAFE_PINNED ) ,
51
+ )
49
52
}
50
53
AdtId :: UnionId ( id) => {
51
54
let data = db. union_signature ( id) ;
52
55
let mut r = SmallVec :: new ( ) ;
53
56
r. push ( handle_variant ( id. into ( ) , & db. variant_fields ( id. into ( ) ) ) ?) ;
54
- ( r, data. repr . unwrap_or_default ( ) )
57
+ ( r, data. repr . unwrap_or_default ( ) , false )
55
58
}
56
59
AdtId :: EnumId ( e) => {
57
60
let variants = db. enum_variants ( e) ;
@@ -60,7 +63,7 @@ pub fn layout_of_adt_query(
60
63
. iter ( )
61
64
. map ( |& ( v, _) | handle_variant ( v. into ( ) , & db. variant_fields ( v. into ( ) ) ) )
62
65
. collect :: < Result < SmallVec < _ > , _ > > ( ) ?;
63
- ( r, db. enum_signature ( e) . repr . unwrap_or_default ( ) )
66
+ ( r, db. enum_signature ( e) . repr . unwrap_or_default ( ) , false )
64
67
}
65
68
} ;
66
69
let variants = variants
@@ -75,7 +78,7 @@ pub fn layout_of_adt_query(
75
78
& repr,
76
79
& variants,
77
80
matches ! ( def, AdtId :: EnumId ( ..) ) ,
78
- is_unsafe_cell ( db , def ) ,
81
+ is_special_no_niche ,
79
82
layout_scalar_valid_range ( db, def) ,
80
83
|min, max| repr_discr ( dl, & repr, min, max) . unwrap_or ( ( Integer :: I8 , false ) ) ,
81
84
variants. iter_enumerated ( ) . filter_map ( |( id, _) | {
0 commit comments