@@ -1115,6 +1115,179 @@ fn test_enum_with_funcs() {
11151115 run_test ( cxx, hdr, rs, & [ "Bob" , "give_bob" ] , & [ ] ) ;
11161116}
11171117
1118+ #[ test]
1119+ fn test_bitfield_enum ( ) {
1120+ let hdr = indoc ! { "
1121+ #include <cstdint>
1122+ enum SomeFlags : int {
1123+ FLAG_A = 1 << 0, // 0x1
1124+ FLAG_B = 1 << 2, // 0x4
1125+ FLAG_C = FLAG_A | FLAG_B, // 0x5
1126+ };
1127+ " } ;
1128+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1129+ let rs = quote ! {
1130+ use autocxx:: prelude:: * ;
1131+ include_cpp! {
1132+ #hexathorpe include "input.h"
1133+ safety!( unsafe_ffi)
1134+ enum_style!( BitfieldEnum , "SomeFlags" )
1135+ generate_pod!( "SomeFlags" )
1136+ }
1137+
1138+ fn main( ) {
1139+ let a = ffi:: SomeFlags :: FLAG_A ;
1140+ let b = ffi:: SomeFlags :: FLAG_B ;
1141+ let c = ffi:: SomeFlags :: FLAG_C ;
1142+ assert_eq!( a. 0 , 0x1 ) ;
1143+ assert_eq!( b. 0 , 0x4 ) ;
1144+ assert_eq!( c. 0 , 0x5 ) ;
1145+
1146+ let aob = ffi:: SomeFlags :: FLAG_A | ffi:: SomeFlags :: FLAG_B ;
1147+ assert_eq!( aob. 0 , 0x5 ) ;
1148+ assert_eq!( aob. 0 , ffi:: SomeFlags :: FLAG_C . 0 ) ;
1149+
1150+ let anb = ffi:: SomeFlags :: FLAG_A & ffi:: SomeFlags :: FLAG_B ;
1151+ assert_eq!( anb. 0 , 0x0 ) ;
1152+ }
1153+ } ;
1154+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1155+ }
1156+
1157+ #[ test]
1158+ fn test_newtype_enum ( ) {
1159+ let hdr = indoc ! { "
1160+ #include <cstdint>
1161+ enum SomeFlags : int {
1162+ FLAG_A = 1 << 0, // 0x1
1163+ FLAG_B = 1 << 2, // 0x4
1164+ FLAG_C = FLAG_A | FLAG_B, // 0x5
1165+ };
1166+ " } ;
1167+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1168+ let rs = quote ! {
1169+ use autocxx:: prelude:: * ;
1170+ include_cpp! {
1171+ #hexathorpe include "input.h"
1172+ safety!( unsafe_ffi)
1173+ enum_style!( NewtypeEnum , "SomeFlags" )
1174+ generate_pod!( "SomeFlags" )
1175+ }
1176+
1177+ fn main( ) {
1178+ let a = ffi:: SomeFlags :: FLAG_A ;
1179+ let b = ffi:: SomeFlags :: FLAG_B ;
1180+ let c = ffi:: SomeFlags :: FLAG_C ;
1181+ assert_eq!( a. 0 , 0x1 ) ;
1182+ assert_eq!( b. 0 , 0x4 ) ;
1183+ assert_eq!( c. 0 , 0x5 ) ;
1184+ }
1185+ } ;
1186+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1187+ }
1188+
1189+ #[ test]
1190+ fn test_rustified_enum ( ) {
1191+ let hdr = indoc ! { "
1192+ enum Bob {
1193+ BOB_VALUE_1,
1194+ BOB_VALUE_2,
1195+ };
1196+ " } ;
1197+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1198+ let rs = quote ! {
1199+ use autocxx:: prelude:: * ;
1200+ include_cpp! {
1201+ #hexathorpe include "input.h"
1202+ safety!( unsafe_ffi)
1203+ enum_style!( RustifiedEnum , "Bob" )
1204+ generate_pod!( "Bob" )
1205+ }
1206+
1207+ fn main( ) {
1208+ let a = ffi:: Bob :: BOB_VALUE_1 ;
1209+ let b = ffi:: Bob :: BOB_VALUE_2 ;
1210+ assert!( a != b) ;
1211+ }
1212+ } ;
1213+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1214+ }
1215+
1216+ #[ test]
1217+ fn test_rustified_nonexhaustive_enum ( ) {
1218+ let hdr = indoc ! { "
1219+ enum Bob {
1220+ BOB_VALUE_1,
1221+ BOB_VALUE_2,
1222+ };
1223+ " } ;
1224+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1225+ let rs = quote ! {
1226+ use autocxx:: prelude:: * ;
1227+ include_cpp! {
1228+ #hexathorpe include "input.h"
1229+ safety!( unsafe_ffi)
1230+ enum_style!( RustifiedEnum , "Bob" )
1231+ generate_pod!( "Bob" )
1232+ }
1233+
1234+ fn main( ) {
1235+ let a = ffi:: Bob :: BOB_VALUE_1 ;
1236+ let b = ffi:: Bob :: BOB_VALUE_2 ;
1237+ assert!( a != b) ;
1238+ }
1239+ } ;
1240+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1241+ }
1242+
1243+ #[ test]
1244+ fn test_several_enums ( ) {
1245+ let hdr = indoc ! { "
1246+ enum First : int {
1247+ FIRST_A = 5,
1248+ FIRST_B = 6
1249+ };
1250+ enum Second {
1251+ SECOND_A,
1252+ SECOND_B
1253+ };
1254+ enum Default : int {
1255+ DEFAULT_A = 1 << 1,
1256+ DEFAULT_B = 1 << 3
1257+ };
1258+ enum Newtype {
1259+ NEWTYPE_A,
1260+ NEWTYPE_B
1261+ };
1262+ " } ;
1263+ let hexathorpe = Token ! [ #] ( Span :: call_site ( ) ) ;
1264+ let rs = quote ! {
1265+ use autocxx:: prelude:: * ;
1266+ include_cpp! {
1267+ #hexathorpe include "input.h"
1268+ safety!( unsafe_ffi)
1269+ enum_style!( BitfieldEnum , "First" , "Second" )
1270+ enum_style!( NewtypeEnum , "Newtype" )
1271+ generate_pod!( "First" )
1272+ generate_pod!( "Second" )
1273+ generate_pod!( "Newtype" )
1274+ generate!( "Default" )
1275+ }
1276+
1277+ fn main( ) {
1278+ let first_a = ffi:: First :: FIRST_A ;
1279+ let first_b = ffi:: First :: FIRST_B ;
1280+ assert_eq!( ( first_a & first_b) . 0 , 0x4 ) ;
1281+ let second_a = ffi:: Second :: SECOND_A ;
1282+ let second_b = ffi:: Second :: SECOND_B ;
1283+ assert_eq!( ( second_a | second_b) . 0 , 0x1 ) ;
1284+ assert!( ffi:: Default :: DEFAULT_A != ffi:: Default :: DEFAULT_B ) ;
1285+ assert!( ffi:: Newtype :: NEWTYPE_A != ffi:: Newtype :: NEWTYPE_B ) ;
1286+ }
1287+ } ;
1288+ do_run_test_manual ( "" , hdr, rs, None , None ) . unwrap ( ) ;
1289+ }
1290+
11181291#[ test]
11191292fn test_re_export ( ) {
11201293 let cxx = indoc ! { "
0 commit comments