@@ -9,6 +9,7 @@ use crate::require_same_types;
99
1010use rustc_errors:: struct_span_err;
1111use rustc_hir as hir;
12+ use rustc_hir:: lang_items:: LangItem ;
1213use rustc_middle:: traits:: { ObligationCause , ObligationCauseCode } ;
1314use rustc_middle:: ty:: subst:: Subst ;
1415use rustc_middle:: ty:: { self , TyCtxt } ;
@@ -120,18 +121,17 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
120121 . copied ( ) ,
121122 ) ;
122123 let mk_va_list_ty = |mutbl| {
123- tcx. lang_items ( ) . va_list ( ) . map ( |did| {
124- let region = tcx. mk_region ( ty:: ReLateBound (
125- ty:: INNERMOST ,
126- ty:: BoundRegion { var : ty:: BoundVar :: from_u32 ( 0 ) , kind : ty:: BrAnon ( 0 ) } ,
127- ) ) ;
128- let env_region = tcx. mk_region ( ty:: ReLateBound (
129- ty:: INNERMOST ,
130- ty:: BoundRegion { var : ty:: BoundVar :: from_u32 ( 1 ) , kind : ty:: BrEnv } ,
131- ) ) ;
132- let va_list_ty = tcx. type_of ( did) . subst ( tcx, & [ region. into ( ) ] ) ;
133- ( tcx. mk_ref ( env_region, ty:: TypeAndMut { ty : va_list_ty, mutbl } ) , va_list_ty)
134- } )
124+ let did = tcx. require_lang_item ( LangItem :: VaList , Some ( it. span ) ) ;
125+ let region = tcx. mk_region ( ty:: ReLateBound (
126+ ty:: INNERMOST ,
127+ ty:: BoundRegion { var : ty:: BoundVar :: from_u32 ( 0 ) , kind : ty:: BrAnon ( 0 ) } ,
128+ ) ) ;
129+ let env_region = tcx. mk_region ( ty:: ReLateBound (
130+ ty:: INNERMOST ,
131+ ty:: BoundRegion { var : ty:: BoundVar :: from_u32 ( 1 ) , kind : ty:: BrEnv } ,
132+ ) ) ;
133+ let va_list_ty = tcx. type_of ( did) . subst ( tcx, & [ region. into ( ) ] ) ;
134+ ( tcx. mk_ref ( env_region, ty:: TypeAndMut { ty : va_list_ty, mutbl } ) , va_list_ty)
135135 } ;
136136
137137 let ( n_tps, n_lts, inputs, output, unsafety) = if name_str. starts_with ( "atomic_" ) {
@@ -191,7 +191,9 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
191191 sym:: needs_drop => ( 1 , Vec :: new ( ) , tcx. types . bool ) ,
192192
193193 sym:: type_name => ( 1 , Vec :: new ( ) , tcx. mk_static_str ( ) ) ,
194- sym:: type_id => ( 1 , Vec :: new ( ) , tcx. types . u64 ) ,
194+ sym:: type_id => {
195+ ( 1 , Vec :: new ( ) , tcx. type_of ( tcx. require_lang_item ( LangItem :: TypeId , Some ( it. span ) ) ) )
196+ }
195197 sym:: offset | sym:: arith_offset => (
196198 1 ,
197199 vec ! [
@@ -366,23 +368,21 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
366368 )
367369 }
368370
369- sym:: va_start | sym:: va_end => match mk_va_list_ty ( hir :: Mutability :: Mut ) {
370- Some ( ( va_list_ref_ty, _) ) => ( 0 , vec ! [ va_list_ref_ty ] , tcx . mk_unit ( ) ) ,
371- None => bug ! ( "`va_list` language item needed for C-variadic intrinsics" ) ,
372- } ,
371+ sym:: va_start | sym:: va_end => {
372+ let ( va_list_ref_ty, _) = mk_va_list_ty ( hir :: Mutability :: Mut ) ;
373+ ( 0 , vec ! [ va_list_ref_ty ] , tcx . mk_unit ( ) )
374+ }
373375
374- sym:: va_copy => match mk_va_list_ty ( hir:: Mutability :: Not ) {
375- Some ( ( va_list_ref_ty, va_list_ty) ) => {
376- let va_list_ptr_ty = tcx. mk_mut_ptr ( va_list_ty) ;
377- ( 0 , vec ! [ va_list_ptr_ty, va_list_ref_ty] , tcx. mk_unit ( ) )
378- }
379- None => bug ! ( "`va_list` language item needed for C-variadic intrinsics" ) ,
380- } ,
376+ sym:: va_copy => {
377+ let ( va_list_ref_ty, va_list_ty) = mk_va_list_ty ( hir:: Mutability :: Not ) ;
378+ let va_list_ptr_ty = tcx. mk_mut_ptr ( va_list_ty) ;
379+ ( 0 , vec ! [ va_list_ptr_ty, va_list_ref_ty] , tcx. mk_unit ( ) )
380+ }
381381
382- sym:: va_arg => match mk_va_list_ty ( hir :: Mutability :: Mut ) {
383- Some ( ( va_list_ref_ty, _) ) => ( 1 , vec ! [ va_list_ref_ty ] , param ( 0 ) ) ,
384- None => bug ! ( "`va_list` language item needed for C-variadic intrinsics" ) ,
385- } ,
382+ sym:: va_arg => {
383+ let ( va_list_ref_ty, _) = mk_va_list_ty ( hir :: Mutability :: Mut ) ;
384+ ( 1 , vec ! [ va_list_ref_ty ] , param ( 0 ) )
385+ }
386386
387387 sym:: nontemporal_store => ( 1 , vec ! [ tcx. mk_mut_ptr( param( 0 ) ) , param( 0 ) ] , tcx. mk_unit ( ) ) ,
388388
0 commit comments