Skip to content

Commit 377b2d7

Browse files
committed
Require a repr attribute
1 parent acd71dd commit 377b2d7

File tree

4 files changed

+13
-6
lines changed

4 files changed

+13
-6
lines changed

enumflags_derive/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,12 @@ fn gen_enumflags(ident: &Ident, item: &DeriveInput, data: &DataEnum)
159159
let variants = data.variants.iter().map(|v| &v.ident);
160160
let variants_len = data.variants.len();
161161
let names = std::iter::repeat(&ident);
162-
let ty = extract_repr(&item.attrs)?
163-
.unwrap_or_else(|| Ident::new("usize", span));
164162

165163
let deferred = verify_flag_values(ident, data.variants.iter())?;
164+
165+
let ty = extract_repr(&item.attrs)?
166+
.ok_or_else(|| syn::Error::new_spanned(&ident,
167+
"repr attribute missing. Add #[repr(u64)] or a similar attribute to specify the size of the bitfield."))?;
166168
let std_path = quote_spanned!(span => ::enumflags2::_internal::core);
167169
let all = if variants_len == 0 {
168170
quote!(0)

src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
//! use enumflags2::{bitflags, BitFlags};
1010
//!
1111
//! #[bitflags]
12-
//! #[derive(Copy, Clone, Debug, PartialEq)]
1312
//! #[repr(u8)]
13+
//! #[derive(Copy, Clone, Debug, PartialEq)]
1414
//! enum Test {
1515
//! A = 0b0001,
1616
//! B = 0b0010,
@@ -105,6 +105,7 @@ pub trait BitFlag: Copy + Clone + 'static + _internal::RawBitFlags {
105105
/// ```
106106
/// # use enumflags2::{bitflags, BitFlags};
107107
/// #[bitflags]
108+
/// #[repr(u8)]
108109
/// #[derive(Clone, Copy, PartialEq, Eq)]
109110
/// enum MyFlag {
110111
/// One = 1 << 0,
@@ -134,6 +135,7 @@ pub trait BitFlag: Copy + Clone + 'static + _internal::RawBitFlags {
134135
/// ```
135136
/// # use enumflags2::{bitflags, BitFlags};
136137
/// #[bitflags]
138+
/// #[repr(u8)]
137139
/// #[derive(Clone, Copy, PartialEq, Eq)]
138140
/// enum MyFlag {
139141
/// One = 1 << 0,
@@ -289,6 +291,7 @@ where
289291
/// ```
290292
/// # use enumflags2::{bitflags, BitFlags};
291293
/// #[bitflags]
294+
/// #[repr(u8)]
292295
/// #[derive(Clone, Copy, PartialEq, Eq)]
293296
/// enum MyFlag {
294297
/// One = 1 << 0,
@@ -315,6 +318,7 @@ where
315318
/// ```
316319
/// # use enumflags2::{bitflags, BitFlags};
317320
/// #[bitflags]
321+
/// #[repr(u8)]
318322
/// #[derive(Clone, Copy, PartialEq, Eq)]
319323
/// enum MyFlag {
320324
/// One = 1 << 0,

test_suite/ui/overlapping_flags.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#[enumflags2::bitflags]
2+
#[repr(u8)]
23
#[derive(Copy, Clone)]
34
enum Foo {
45
SomeFlag = 1 << 0,
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
error[E0081]: discriminant value `1` already exists
2-
--> $DIR/overlapping_flags.rs:5:23
2+
--> $DIR/overlapping_flags.rs:6:23
33
|
4-
4 | SomeFlag = 1 << 0,
4+
5 | SomeFlag = 1 << 0,
55
| ------ first use of `1`
6-
5 | OverlappingFlag = 1 << 0,
6+
6 | OverlappingFlag = 1 << 0,
77
| ^^^^^^ enum already has `1`

0 commit comments

Comments
 (0)