Skip to content

Commit

Permalink
constant: Add support for unary negation.
Browse files Browse the repository at this point in the history
  • Loading branch information
emilio committed Jun 7, 2022
1 parent 0ee47b3 commit e7b814d
Show file tree
Hide file tree
Showing 11 changed files with 17 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/bindgen/ir/constant.rs
Expand Up @@ -417,6 +417,13 @@ impl Literal {
syn::Expr::Unary(syn::ExprUnary {
ref op, ref expr, ..
}) => match *op {
UnOp::Not(_) => {
let val = Self::load(expr)?;
Ok(Literal::PostfixUnaryOp {
op: "~",
value: Box::new(val),
})
},
UnOp::Neg(_) => {
let val = Self::load(expr)?;
Ok(Literal::PostfixUnaryOp {
Expand Down
1 change: 1 addition & 0 deletions tests/expectations/bitflags.both.c
Expand Up @@ -50,5 +50,6 @@ typedef struct LargeFlags {
* Flag with a very large shift that usually would be narrowed.
*/
#define LargeFlags_LARGE_SHIFT (LargeFlags){ .bits = (uint64_t)(1ull << 44) }
#define LargeFlags_INVERTED (LargeFlags){ .bits = (uint64_t)~(LargeFlags_LARGE_SHIFT).bits }

void root(struct AlignFlags flags, struct DebugFlags bigger_flags, struct LargeFlags largest_flags);
1 change: 1 addition & 0 deletions tests/expectations/bitflags.both.compat.c
Expand Up @@ -50,6 +50,7 @@ typedef struct LargeFlags {
* Flag with a very large shift that usually would be narrowed.
*/
#define LargeFlags_LARGE_SHIFT (LargeFlags){ .bits = (uint64_t)(1ull << 44) }
#define LargeFlags_INVERTED (LargeFlags){ .bits = (uint64_t)~(LargeFlags_LARGE_SHIFT).bits }

#ifdef __cplusplus
extern "C" {
Expand Down
1 change: 1 addition & 0 deletions tests/expectations/bitflags.c
Expand Up @@ -50,5 +50,6 @@ typedef struct {
* Flag with a very large shift that usually would be narrowed.
*/
#define LargeFlags_LARGE_SHIFT (LargeFlags){ .bits = (uint64_t)(1ull << 44) }
#define LargeFlags_INVERTED (LargeFlags){ .bits = (uint64_t)~(LargeFlags_LARGE_SHIFT).bits }

void root(AlignFlags flags, DebugFlags bigger_flags, LargeFlags largest_flags);
1 change: 1 addition & 0 deletions tests/expectations/bitflags.compat.c
Expand Up @@ -50,6 +50,7 @@ typedef struct {
* Flag with a very large shift that usually would be narrowed.
*/
#define LargeFlags_LARGE_SHIFT (LargeFlags){ .bits = (uint64_t)(1ull << 44) }
#define LargeFlags_INVERTED (LargeFlags){ .bits = (uint64_t)~(LargeFlags_LARGE_SHIFT).bits }

#ifdef __cplusplus
extern "C" {
Expand Down
1 change: 1 addition & 0 deletions tests/expectations/bitflags.cpp
Expand Up @@ -119,6 +119,7 @@ struct LargeFlags {
};
/// Flag with a very large shift that usually would be narrowed.
constexpr static const LargeFlags LargeFlags_LARGE_SHIFT = LargeFlags{ /* .bits = */ (uint64_t)(1ull << 44) };
constexpr static const LargeFlags LargeFlags_INVERTED = LargeFlags{ /* .bits = */ (uint64_t)~(LargeFlags_LARGE_SHIFT).bits };

extern "C" {

Expand Down
1 change: 1 addition & 0 deletions tests/expectations/bitflags.pyx
Expand Up @@ -34,5 +34,6 @@ cdef extern from *:
uint64_t bits;
# Flag with a very large shift that usually would be narrowed.
const LargeFlags LargeFlags_LARGE_SHIFT # = <LargeFlags>{ <uint64_t>(1ull << 44) }
const LargeFlags LargeFlags_INVERTED # = <LargeFlags>{ <uint64_t>~(LargeFlags_LARGE_SHIFT).bits }

void root(AlignFlags flags, DebugFlags bigger_flags, LargeFlags largest_flags);
1 change: 1 addition & 0 deletions tests/expectations/bitflags.tag.c
Expand Up @@ -50,5 +50,6 @@ struct LargeFlags {
* Flag with a very large shift that usually would be narrowed.
*/
#define LargeFlags_LARGE_SHIFT (LargeFlags){ .bits = (uint64_t)(1ull << 44) }
#define LargeFlags_INVERTED (LargeFlags){ .bits = (uint64_t)~(LargeFlags_LARGE_SHIFT).bits }

void root(struct AlignFlags flags, struct DebugFlags bigger_flags, struct LargeFlags largest_flags);
1 change: 1 addition & 0 deletions tests/expectations/bitflags.tag.compat.c
Expand Up @@ -50,6 +50,7 @@ struct LargeFlags {
* Flag with a very large shift that usually would be narrowed.
*/
#define LargeFlags_LARGE_SHIFT (LargeFlags){ .bits = (uint64_t)(1ull << 44) }
#define LargeFlags_INVERTED (LargeFlags){ .bits = (uint64_t)~(LargeFlags_LARGE_SHIFT).bits }

#ifdef __cplusplus
extern "C" {
Expand Down
1 change: 1 addition & 0 deletions tests/expectations/bitflags.tag.pyx
Expand Up @@ -34,5 +34,6 @@ cdef extern from *:
uint64_t bits;
# Flag with a very large shift that usually would be narrowed.
const LargeFlags LargeFlags_LARGE_SHIFT # = <LargeFlags>{ <uint64_t>(1ull << 44) }
const LargeFlags LargeFlags_INVERTED # = <LargeFlags>{ <uint64_t>~(LargeFlags_LARGE_SHIFT).bits }

void root(AlignFlags flags, DebugFlags bigger_flags, LargeFlags largest_flags);
1 change: 1 addition & 0 deletions tests/rust/bitflags.rs
Expand Up @@ -34,6 +34,7 @@ bitflags! {
pub struct LargeFlags: u64 {
/// Flag with a very large shift that usually would be narrowed.
const LARGE_SHIFT = 1u64 << 44;
const INVERTED = !Self::LARGE_SHIFT.bits;
}
}

Expand Down

0 comments on commit e7b814d

Please sign in to comment.