@@ -2148,7 +2148,10 @@ impl EnumVariation {
2148
2148
2149
2149
/// A helper type to construct different enum variations.
2150
2150
enum EnumBuilder < ' a > {
2151
- Rust ( quote:: Tokens ) ,
2151
+ Rust {
2152
+ tokens : quote:: Tokens ,
2153
+ emitted_any_variants : bool ,
2154
+ } ,
2152
2155
Bitfield {
2153
2156
canonical_name : & ' a str ,
2154
2157
tokens : quote:: Tokens ,
@@ -2188,7 +2191,10 @@ impl<'a> EnumBuilder<'a> {
2188
2191
pub enum #ident
2189
2192
} ;
2190
2193
tokens. append ( "{" ) ;
2191
- EnumBuilder :: Rust ( tokens)
2194
+ EnumBuilder :: Rust {
2195
+ tokens,
2196
+ emitted_any_variants : false ,
2197
+ }
2192
2198
}
2193
2199
2194
2200
EnumVariation :: Consts => {
@@ -2229,12 +2235,15 @@ impl<'a> EnumBuilder<'a> {
2229
2235
} ;
2230
2236
2231
2237
match self {
2232
- EnumBuilder :: Rust ( tokens) => {
2238
+ EnumBuilder :: Rust { tokens, emitted_any_variants : _ } => {
2233
2239
let name = ctx. rust_ident ( variant_name) ;
2234
- EnumBuilder :: Rust ( quote ! {
2235
- #tokens
2236
- #name = #expr,
2237
- } )
2240
+ EnumBuilder :: Rust {
2241
+ tokens : quote ! {
2242
+ #tokens
2243
+ #name = #expr,
2244
+ } ,
2245
+ emitted_any_variants : true ,
2246
+ }
2238
2247
}
2239
2248
2240
2249
EnumBuilder :: Bitfield { .. } => {
@@ -2295,9 +2304,12 @@ impl<'a> EnumBuilder<'a> {
2295
2304
result : & mut CodegenResult < ' b > ,
2296
2305
) -> quote:: Tokens {
2297
2306
match self {
2298
- EnumBuilder :: Rust ( mut t) => {
2299
- t. append ( "}" ) ;
2300
- t
2307
+ EnumBuilder :: Rust { mut tokens, emitted_any_variants } => {
2308
+ if !emitted_any_variants {
2309
+ tokens. append ( quote ! { __bindgen_cannot_repr_c_on_empty_enum = 0 } ) ;
2310
+ }
2311
+ tokens. append ( "}" ) ;
2312
+ tokens
2301
2313
}
2302
2314
EnumBuilder :: Bitfield {
2303
2315
canonical_name,
@@ -2432,15 +2444,12 @@ impl CodeGenerator for Enum {
2432
2444
2433
2445
let mut attrs = vec ! [ ] ;
2434
2446
2435
- // FIXME: Rust forbids repr with empty enums. Remove this condition when
2436
- // this is allowed.
2437
- //
2438
2447
// TODO(emilio): Delegate this to the builders?
2439
2448
if variation. is_rust ( ) {
2440
- if ! self . variants ( ) . is_empty ( ) {
2441
- attrs . push ( attributes :: repr ( repr_name ) ) ;
2442
- }
2443
- } else if variation. is_bitfield ( ) {
2449
+ attrs . push ( attributes :: repr ( repr_name ) ) ;
2450
+ }
2451
+
2452
+ if variation. is_bitfield ( ) || variation . is_rust ( ) {
2444
2453
attrs. push ( attributes:: repr ( "C" ) ) ;
2445
2454
}
2446
2455
0 commit comments