@@ -1852,6 +1852,41 @@ impl<'a, 'gcx, 'tcx> TyS<'tcx> {
1852
1852
_ => bug ! ( "cannot convert type `{:?}` to a closure kind" , self ) ,
1853
1853
}
1854
1854
}
1855
+
1856
+ /// Fast path helper for testing if a type is `Sized`.
1857
+ ///
1858
+ /// Returning true means the type is known to be sized. Returning
1859
+ /// `false` means nothing -- could be sized, might not be.
1860
+ pub fn is_trivially_sized ( & self , tcx : TyCtxt < ' _ , ' _ , ' tcx > ) -> bool {
1861
+ match self . sty {
1862
+ ty:: TyInfer ( ty:: IntVar ( _) ) | ty:: TyInfer ( ty:: FloatVar ( _) ) |
1863
+ ty:: TyUint ( _) | ty:: TyInt ( _) | ty:: TyBool | ty:: TyFloat ( _) |
1864
+ ty:: TyFnDef ( ..) | ty:: TyFnPtr ( _) | ty:: TyRawPtr ( ..) |
1865
+ ty:: TyChar | ty:: TyRef ( ..) | ty:: TyGenerator ( ..) |
1866
+ ty:: TyGeneratorWitness ( ..) | ty:: TyArray ( ..) | ty:: TyClosure ( ..) |
1867
+ ty:: TyNever | ty:: TyError =>
1868
+ true ,
1869
+
1870
+ ty:: TyStr | ty:: TySlice ( _) | ty:: TyDynamic ( ..) | ty:: TyForeign ( ..) =>
1871
+ false ,
1872
+
1873
+ ty:: TyTuple ( tys) =>
1874
+ tys. iter ( ) . all ( |ty| ty. is_trivially_sized ( tcx) ) ,
1875
+
1876
+ ty:: TyAdt ( def, _substs) =>
1877
+ def. sized_constraint ( tcx) . is_empty ( ) ,
1878
+
1879
+ ty:: TyProjection ( _) | ty:: TyParam ( _) | ty:: TyAnon ( ..) => false ,
1880
+
1881
+ ty:: TyInfer ( ty:: TyVar ( _) ) => false ,
1882
+
1883
+ ty:: TyInfer ( ty:: CanonicalTy ( _) ) |
1884
+ ty:: TyInfer ( ty:: FreshTy ( _) ) |
1885
+ ty:: TyInfer ( ty:: FreshIntTy ( _) ) |
1886
+ ty:: TyInfer ( ty:: FreshFloatTy ( _) ) =>
1887
+ bug ! ( "is_trivially_sized applied to unexpected type: {:?}" , self ) ,
1888
+ }
1889
+ }
1855
1890
}
1856
1891
1857
1892
/// Typed constant value.
0 commit comments