@@ -1716,6 +1716,54 @@ impl<'tcx> LateLintPass<'tcx> for ImproperCTypesLint {
1716
1716
self . check_foreign_fn ( cx, CItemKind :: ExportedFunction , id, decl) ;
1717
1717
}
1718
1718
}
1719
+
1720
+ fn check_trait_item ( & mut self , cx : & LateContext < ' tcx > , tr_it : & hir:: TraitItem < ' tcx > ) {
1721
+ match tr_it. kind {
1722
+ hir:: TraitItemKind :: Const ( hir_ty, _) => {
1723
+ let ty = cx. tcx . type_of ( hir_ty. hir_id . owner . def_id ) . instantiate_identity ( ) ;
1724
+ self . check_type_for_external_abi_fnptr ( cx, hir_ty, ty) ;
1725
+ }
1726
+ hir:: TraitItemKind :: Fn ( sig, trait_fn) => {
1727
+ match trait_fn {
1728
+ // if the method is defined here,
1729
+ // there is a matching ``LateLintPass::check_fn`` call,
1730
+ // let's not redo that work
1731
+ hir:: TraitFn :: Provided ( _) => return ,
1732
+ hir:: TraitFn :: Required ( _) => ( ) ,
1733
+ }
1734
+ let local_id = tr_it. owner_id . def_id ;
1735
+ if sig. header . abi . is_rustic_abi ( ) {
1736
+ self . check_fn_for_external_abi_fnptr ( cx, local_id, sig. decl ) ;
1737
+ } else {
1738
+ self . check_foreign_fn ( cx, CItemKind :: ExportedFunction , local_id, sig. decl ) ;
1739
+ }
1740
+ }
1741
+ hir:: TraitItemKind :: Type ( _, ty_maybe) => {
1742
+ if let Some ( hir_ty) = ty_maybe {
1743
+ let ty = cx. tcx . type_of ( hir_ty. hir_id . owner . def_id ) . instantiate_identity ( ) ;
1744
+ self . check_type_for_external_abi_fnptr ( cx, hir_ty, ty) ;
1745
+ }
1746
+ }
1747
+ }
1748
+ }
1749
+ fn check_impl_item ( & mut self , cx : & LateContext < ' tcx > , im_it : & hir:: ImplItem < ' tcx > ) {
1750
+ // note: we do not skip these checks eventhough they might generate dupe warnings because:
1751
+ // - the corresponding trait might be in another crate
1752
+ // - the corresponding trait might have some templating involved, so only the impl has the full type information
1753
+ match im_it. kind {
1754
+ hir:: ImplItemKind :: Type ( hir_ty) => {
1755
+ let ty = cx. tcx . type_of ( hir_ty. hir_id . owner . def_id ) . instantiate_identity ( ) ;
1756
+ self . check_type_for_external_abi_fnptr ( cx, hir_ty, ty) ;
1757
+ }
1758
+ hir:: ImplItemKind :: Fn ( _sig, _) => {
1759
+ // see ``LateLintPass::check_fn``
1760
+ }
1761
+ hir:: ImplItemKind :: Const ( hir_ty, _) => {
1762
+ let ty = cx. tcx . type_of ( hir_ty. hir_id . owner . def_id ) . instantiate_identity ( ) ;
1763
+ self . check_type_for_external_abi_fnptr ( cx, hir_ty, ty) ;
1764
+ }
1765
+ }
1766
+ }
1719
1767
}
1720
1768
1721
1769
declare_lint ! {
0 commit comments