diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 56976adb..eb52928a 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -1944,6 +1944,13 @@ bool Converter::VisitExplicitCastExpr(clang::ExplicitCastExpr *expr) { ConvertIntegerToEnumeralCast(expr, sub_expr); return false; } + if (type->isBooleanType() && sub_expr->getType()->isIntegerType() && + !sub_expr->getType()->isBooleanType()) { + PushParen paren(*this); + Convert(sub_expr); + StrCat(token::kDiff, token::kZero); + return false; + } { PushParen paren(*this); Convert(sub_expr); diff --git a/tests/unit/int_to_bool_explicit.cpp b/tests/unit/int_to_bool_explicit.cpp new file mode 100644 index 00000000..3ffec234 --- /dev/null +++ b/tests/unit/int_to_bool_explicit.cpp @@ -0,0 +1,10 @@ +#include + +int main() { + unsigned int flag = 7; + bool b1 = (bool)flag; + bool b2 = (bool)0u; + assert(b1); + assert(!b2); + return 0; +} diff --git a/tests/unit/int_to_bool_explicit_c.c b/tests/unit/int_to_bool_explicit_c.c new file mode 100644 index 00000000..b377a227 --- /dev/null +++ b/tests/unit/int_to_bool_explicit_c.c @@ -0,0 +1,11 @@ +#include +#include + +int main() { + unsigned int flag = 7; + bool b1 = (bool)flag; + bool b2 = (bool)0u; + assert(b1); + assert(!b2); + return 0; +} diff --git a/tests/unit/out/refcount/int_to_bool_explicit.rs b/tests/unit/out/refcount/int_to_bool_explicit.rs new file mode 100644 index 00000000..4024521f --- /dev/null +++ b/tests/unit/out/refcount/int_to_bool_explicit.rs @@ -0,0 +1,19 @@ +extern crate libcc2rs; +use libcc2rs::*; +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io::prelude::*; +use std::io::{Read, Seek, Write}; +use std::os::fd::AsFd; +use std::rc::{Rc, Weak}; +pub fn main() { + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let flag: Value = Rc::new(RefCell::new(7_u32)); + let b1: Value = Rc::new(RefCell::new(((*flag.borrow()) != 0))); + let b2: Value = Rc::new(RefCell::new((0_u32 != 0))); + assert!((*b1.borrow())); + assert!(!(*b2.borrow())); + return 0; +} diff --git a/tests/unit/out/refcount/int_to_bool_explicit_c.rs b/tests/unit/out/refcount/int_to_bool_explicit_c.rs new file mode 100644 index 00000000..0bd69774 --- /dev/null +++ b/tests/unit/out/refcount/int_to_bool_explicit_c.rs @@ -0,0 +1,19 @@ +extern crate libcc2rs; +use libcc2rs::*; +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io::prelude::*; +use std::io::{Read, Seek, Write}; +use std::os::fd::AsFd; +use std::rc::{Rc, Weak}; +pub fn main() { + std::process::exit(main_0()); +} +fn main_0() -> i32 { + let flag: Value = Rc::new(RefCell::new(7_u32)); + let b1: Value = Rc::new(RefCell::new(((*flag.borrow()) != 0))); + let b2: Value = Rc::new(RefCell::new((0_u32 != 0))); + assert!((*b1.borrow())); + assert!(((!(*b2.borrow()) as i32) != 0)); + return 0; +} diff --git a/tests/unit/out/unsafe/int_to_bool_explicit.rs b/tests/unit/out/unsafe/int_to_bool_explicit.rs new file mode 100644 index 00000000..10d0a906 --- /dev/null +++ b/tests/unit/out/unsafe/int_to_bool_explicit.rs @@ -0,0 +1,21 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub fn main() { + unsafe { + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + let mut flag: u32 = 7_u32; + let mut b1: bool = (flag != 0); + let mut b2: bool = (0_u32 != 0); + assert!(b1); + assert!(!b2); + return 0; +} diff --git a/tests/unit/out/unsafe/int_to_bool_explicit_c.rs b/tests/unit/out/unsafe/int_to_bool_explicit_c.rs new file mode 100644 index 00000000..2062c57d --- /dev/null +++ b/tests/unit/out/unsafe/int_to_bool_explicit_c.rs @@ -0,0 +1,21 @@ +extern crate libc; +use libc::*; +extern crate libcc2rs; +use libcc2rs::*; +use std::collections::BTreeMap; +use std::io::{Read, Seek, Write}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd}; +use std::rc::Rc; +pub fn main() { + unsafe { + std::process::exit(main_0() as i32); + } +} +unsafe fn main_0() -> i32 { + let mut flag: u32 = 7_u32; + let mut b1: bool = (flag != 0); + let mut b2: bool = (0_u32 != 0); + assert!(b1); + assert!(((!b2 as i32) != 0)); + return 0; +}