@@ -4,7 +4,7 @@ use rustc_abi::{BackendRepr, TagEncoding, Variants, WrappingRange};
4
4
use rustc_hir:: { Expr , ExprKind , LangItem } ;
5
5
use rustc_middle:: bug;
6
6
use rustc_middle:: ty:: layout:: { LayoutOf , SizeSkeleton } ;
7
- use rustc_middle:: ty:: { self , Ty , TyCtxt , TypeVisitableExt } ;
7
+ use rustc_middle:: ty:: { self , AdtKind , Ty , TyCtxt , TypeVisitableExt } ;
8
8
use rustc_session:: { declare_lint, declare_lint_pass, impl_lint_pass} ;
9
9
use rustc_span:: { Span , Symbol , source_map, sym} ;
10
10
use tracing:: debug;
@@ -981,6 +981,38 @@ pub(crate) fn repr_nullable_ptr<'tcx>(
981
981
None
982
982
}
983
983
984
+ /// determines wether or not `outer_ty` is an option-like enum, with the same size as its contained type, `ty`.
985
+ /// this ASSUMES that `ty` is a type that is already 'inside' of `outer_ty`.
986
+ fn is_outer_optionlike_around_ty < ' tcx > (
987
+ cx : & LateContext < ' tcx > ,
988
+ outer_ty : Ty < ' tcx > ,
989
+ ty : Ty < ' tcx > ,
990
+ ) -> bool {
991
+ // three things to check to be sure outer_ty is option-like (since we know we reached the current ty from there)
992
+ // That outer_ty is an enum, that this enum doesn't have a defined discriminant representation,
993
+ // and the the outer_ty's size is that of ty.
994
+ if let ty:: Adt ( def, _) = outer_ty. kind ( ) {
995
+ if !matches ! ( def. adt_kind( ) , AdtKind :: Enum )
996
+ || def. repr ( ) . c ( )
997
+ || def. repr ( ) . transparent ( )
998
+ || def. repr ( ) . int . is_none ( )
999
+ {
1000
+ false
1001
+ } else {
1002
+ let ( tcx, typing_env) = ( cx. tcx , cx. typing_env ( ) ) ;
1003
+
1004
+ // see the insides of super::repr_nullable_ptr()
1005
+ let compute_size_skeleton = |t| SizeSkeleton :: compute ( t, tcx, typing_env) . ok ( ) ;
1006
+ match ( compute_size_skeleton ( ty) , compute_size_skeleton ( outer_ty) ) {
1007
+ ( Some ( sk1) , Some ( sk2) ) => sk1. same_size ( sk2) ,
1008
+ _ => false ,
1009
+ }
1010
+ }
1011
+ } else {
1012
+ false
1013
+ }
1014
+ }
1015
+
984
1016
declare_lint_pass ! ( VariantSizeDifferences => [ VARIANT_SIZE_DIFFERENCES ] ) ;
985
1017
986
1018
impl < ' tcx > LateLintPass < ' tcx > for VariantSizeDifferences {
0 commit comments