@@ -987,37 +987,39 @@ impl CodeGenerator for TemplateInstantiation {
987
987
// just converted to rust types in fields, vars, etc, we take this
988
988
// opportunity to generate tests for their layout here.
989
989
990
- let layout = item. kind ( ) . expect_type ( ) . layout ( ctx) ;
990
+ if ctx. options ( ) . layout_tests {
991
+ let layout = item. kind ( ) . expect_type ( ) . layout ( ctx) ;
991
992
992
- if let Some ( layout) = layout {
993
- let size = layout. size ;
994
- let align = layout. align ;
993
+ if let Some ( layout) = layout {
994
+ let size = layout. size ;
995
+ let align = layout. align ;
995
996
996
- let name = item. canonical_name ( ctx) ;
997
- let fn_name = format ! ( "__bindgen_test_layout_{}_instantiation_{}" ,
998
- name,
999
- item. id( ) . as_usize( ) ) ;
1000
- let fn_name = ctx. rust_ident_raw ( & fn_name) ;
997
+ let name = item. canonical_name ( ctx) ;
998
+ let fn_name = format ! ( "__bindgen_test_layout_{}_instantiation_{}" ,
999
+ name,
1000
+ item. id( ) . as_usize( ) ) ;
1001
+ let fn_name = ctx. rust_ident_raw ( & fn_name) ;
1001
1002
1002
- let prefix = ctx. trait_prefix ( ) ;
1003
- let ident = item. to_rust_ty_or_opaque ( ctx, & ( ) ) ;
1004
- let size_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1005
- :: $prefix:: mem:: size_of:: <$ident>( ) ) ;
1006
- let align_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1007
- :: $prefix:: mem:: align_of:: <$ident>( ) ) ;
1008
-
1009
- let item = quote_item ! (
1010
- ctx. ext_cx( ) ,
1011
- #[ test]
1012
- fn $fn_name( ) {
1013
- assert_eq!( $size_of_expr, $size,
1014
- concat!( "Size of template specialization: " , stringify!( $ident) ) ) ;
1015
- assert_eq!( $align_of_expr, $align,
1016
- concat!( "Alignment of template specialization: " , stringify!( $ident) ) ) ;
1017
- } )
1018
- . unwrap ( ) ;
1003
+ let prefix = ctx. trait_prefix ( ) ;
1004
+ let ident = item. to_rust_ty_or_opaque ( ctx, & ( ) ) ;
1005
+ let size_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1006
+ :: $prefix:: mem:: size_of:: <$ident>( ) ) ;
1007
+ let align_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1008
+ :: $prefix:: mem:: align_of:: <$ident>( ) ) ;
1019
1009
1020
- result. push ( item) ;
1010
+ let item = quote_item ! (
1011
+ ctx. ext_cx( ) ,
1012
+ #[ test]
1013
+ fn $fn_name( ) {
1014
+ assert_eq!( $size_of_expr, $size,
1015
+ concat!( "Size of template specialization: " , stringify!( $ident) ) ) ;
1016
+ assert_eq!( $align_of_expr, $align,
1017
+ concat!( "Alignment of template specialization: " , stringify!( $ident) ) ) ;
1018
+ } )
1019
+ . unwrap ( ) ;
1020
+
1021
+ result. push ( item) ;
1022
+ }
1021
1023
}
1022
1024
}
1023
1025
}
@@ -1498,76 +1500,78 @@ impl CodeGenerator for CompInfo {
1498
1500
. codegen ( ctx, result, whitelisted_items, & ( ) ) ;
1499
1501
}
1500
1502
1501
- if let Some ( layout) = layout {
1502
- let fn_name = format ! ( "bindgen_test_layout_{}" , canonical_name) ;
1503
- let fn_name = ctx. rust_ident_raw ( & fn_name) ;
1504
- let type_name = ctx. rust_ident_raw ( & canonical_name) ;
1505
- let prefix = ctx. trait_prefix ( ) ;
1506
- let size_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1507
- :: $prefix:: mem:: size_of:: <$type_name>( ) ) ;
1508
- let align_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1509
- :: $prefix:: mem:: align_of:: <$type_name>( ) ) ;
1510
- let size = layout. size ;
1511
- let align = layout. align ;
1512
-
1513
- let check_struct_align = if align > mem:: size_of :: < * mut ( ) > ( ) {
1514
- // FIXME when [RFC 1358](https://github.com/rust-lang/rust/issues/33626) ready
1515
- None
1516
- } else {
1517
- quote_item ! ( ctx. ext_cx( ) ,
1518
- assert_eq!( $align_of_expr,
1519
- $align,
1520
- concat!( "Alignment of " , stringify!( $type_name) ) ) ;
1521
- )
1522
- } ;
1503
+ if ctx. options ( ) . layout_tests {
1504
+ if let Some ( layout) = layout {
1505
+ let fn_name = format ! ( "bindgen_test_layout_{}" , canonical_name) ;
1506
+ let fn_name = ctx. rust_ident_raw ( & fn_name) ;
1507
+ let type_name = ctx. rust_ident_raw ( & canonical_name) ;
1508
+ let prefix = ctx. trait_prefix ( ) ;
1509
+ let size_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1510
+ :: $prefix:: mem:: size_of:: <$type_name>( ) ) ;
1511
+ let align_of_expr = quote_expr ! ( ctx. ext_cx( ) ,
1512
+ :: $prefix:: mem:: align_of:: <$type_name>( ) ) ;
1513
+ let size = layout. size ;
1514
+ let align = layout. align ;
1515
+
1516
+ let check_struct_align = if align > mem:: size_of :: < * mut ( ) > ( ) {
1517
+ // FIXME when [RFC 1358](https://github.com/rust-lang/rust/issues/33626) ready
1518
+ None
1519
+ } else {
1520
+ quote_item ! ( ctx. ext_cx( ) ,
1521
+ assert_eq!( $align_of_expr,
1522
+ $align,
1523
+ concat!( "Alignment of " , stringify!( $type_name) ) ) ;
1524
+ )
1525
+ } ;
1523
1526
1524
- // FIXME when [issue #465](https://github.com/servo/rust-bindgen/issues/465) ready
1525
- let too_many_base_vtables = self . base_members ( )
1526
- . iter ( )
1527
- . filter ( |base| {
1528
- ctx. resolve_type ( base. ty ) . has_vtable ( ctx)
1529
- } )
1530
- . count ( ) > 1 ;
1527
+ // FIXME when [issue #465](https://github.com/servo/rust-bindgen/issues/465) ready
1528
+ let too_many_base_vtables = self . base_members ( )
1529
+ . iter ( )
1530
+ . filter ( |base| {
1531
+ ctx. resolve_type ( base. ty ) . has_vtable ( ctx)
1532
+ } )
1533
+ . count ( ) > 1 ;
1531
1534
1532
- let should_skip_field_offset_checks = item. is_opaque ( ctx) ||
1533
- too_many_base_vtables;
1535
+ let should_skip_field_offset_checks = item. is_opaque ( ctx) ||
1536
+ too_many_base_vtables;
1534
1537
1535
- let check_field_offset = if should_skip_field_offset_checks {
1536
- None
1537
- } else {
1538
- let asserts = self . fields ( )
1539
- . iter ( )
1540
- . filter ( |field| field. bitfield ( ) . is_none ( ) )
1541
- . flat_map ( |field| {
1542
- field. name ( ) . and_then ( |name| {
1543
- field. offset ( ) . and_then ( |offset| {
1544
- let field_offset = offset / 8 ;
1545
- let field_name = ctx. rust_ident ( name) ;
1546
-
1547
- quote_item ! ( ctx. ext_cx( ) ,
1548
- assert_eq!( unsafe { & ( * ( 0 as * const $type_name) ) . $field_name as * const _ as usize } ,
1549
- $field_offset,
1550
- concat!( "Alignment of field: " , stringify!( $type_name) , "::" , stringify!( $field_name) ) ) ;
1551
- )
1538
+ let check_field_offset = if should_skip_field_offset_checks {
1539
+ None
1540
+ } else {
1541
+ let asserts = self . fields ( )
1542
+ . iter ( )
1543
+ . filter ( |field| field. bitfield ( ) . is_none ( ) )
1544
+ . flat_map ( |field| {
1545
+ field. name ( ) . and_then ( |name| {
1546
+ field. offset ( ) . and_then ( |offset| {
1547
+ let field_offset = offset / 8 ;
1548
+ let field_name = ctx. rust_ident ( name) ;
1549
+
1550
+ quote_item ! ( ctx. ext_cx( ) ,
1551
+ assert_eq!( unsafe { & ( * ( 0 as * const $type_name) ) . $field_name as * const _ as usize } ,
1552
+ $field_offset,
1553
+ concat!( "Alignment of field: " , stringify!( $type_name) , "::" , stringify!( $field_name) ) ) ;
1554
+ )
1555
+ } )
1552
1556
} )
1553
- } )
1554
- } ) . collect :: < Vec < P < ast:: Item > > > ( ) ;
1557
+ } ) . collect :: < Vec < P < ast:: Item > > > ( ) ;
1555
1558
1556
- Some ( asserts)
1557
- } ;
1559
+ Some ( asserts)
1560
+ } ;
1558
1561
1559
- let item = quote_item ! ( ctx. ext_cx( ) ,
1560
- #[ test]
1561
- fn $fn_name( ) {
1562
- assert_eq!( $size_of_expr,
1563
- $size,
1564
- concat!( "Size of: " , stringify!( $type_name) ) ) ;
1562
+ let item = quote_item ! ( ctx. ext_cx( ) ,
1563
+ #[ test]
1564
+ fn $fn_name( ) {
1565
+ assert_eq!( $size_of_expr,
1566
+ $size,
1567
+ concat!( "Size of: " , stringify!( $type_name) ) ) ;
1565
1568
1566
- $check_struct_align
1567
- $check_field_offset
1568
- } )
1569
- . unwrap ( ) ;
1570
- result. push ( item) ;
1569
+ $check_struct_align
1570
+ $check_field_offset
1571
+ } )
1572
+ . unwrap ( ) ;
1573
+ result. push ( item) ;
1574
+ }
1571
1575
}
1572
1576
1573
1577
let mut method_names = Default :: default ( ) ;
0 commit comments