@@ -123,8 +123,13 @@ bool Converter::VisitBuiltinType(clang::BuiltinType *type) {
123123 StrCat (" f64" );
124124 break ;
125125 case clang::BuiltinType::Char_S:
126- case clang::BuiltinType::UChar:
126+ case clang::BuiltinType::Char_U:
127+ StrCat (CharRustType ());
128+ break ;
127129 case clang::BuiltinType::SChar:
130+ StrCat (" i8" );
131+ break ;
132+ case clang::BuiltinType::UChar:
128133 StrCat (" u8" );
129134 break ;
130135 case clang::BuiltinType::UShort:
@@ -1410,7 +1415,8 @@ bool Converter::GetFmtArg(clang::Expr *arg, std::string &fmt,
14101415 } else if (arg_str.contains (" Setw" )) {
14111416 fmt_width = Trim (ToString (arg));
14121417 } else if (!arg->getType ()->isCharType () &&
1413- Mapper::Map (arg->getType ()) != " Vec<u8>" ) {
1418+ Mapper::Map (arg->getType ()) !=
1419+ std::format (" Vec<{}>" , CharRustType ())) {
14141420 fmt += (" {:" + fmt_width + fmt_trait + " }" );
14151421 fmt_width.clear (); // Reset setw after first usage
14161422 arg_str = ToString (arg);
@@ -1426,11 +1432,13 @@ bool Converter::GetFmtArg(clang::Expr *arg, std::string &fmt,
14261432
14271433bool Converter::GetRawArg (clang::Expr *arg, std::string &raw_args) {
14281434 if (arg->getType ()->isCharType ()) {
1429- raw_args += " (&[" + ToString (arg) + ' ]' ;
1430- } else if (Mapper::Map (arg->getType ()) == " Vec<u8>" ) {
1435+ raw_args += " (&[" + ToString (arg) + " as u8]" ;
1436+ } else if (Mapper::Map (arg->getType ()) ==
1437+ std::format (" Vec<{}>" , CharRustType ())) {
14311438 PushExprKind push (*this , ExprKind::RValue);
14321439 std::string str = ToString (arg);
1433- raw_args += " (&(" + str + " )[..(" + str + " ).len() - 1]" ;
1440+ raw_args += " (&(" + str + " ).iter().take((" + str +
1441+ " ).len() - 1).map(|&c| c as u8).collect::<Vec<u8>>()[..]" ;
14341442 } else if (Mapper::ToString (arg).contains (" std::endl" )) {
14351443 raw_args += " (&[b'\\ n']" ;
14361444 } else if (clang::isa<clang::StringLiteral>(arg->IgnoreImplicit ())) {
@@ -1847,6 +1855,14 @@ Converter::ConvertCallExpr(clang::CallExpr *expr) {
18471855 return std::nullopt ;
18481856}
18491857
1858+ static std::string getTypedLiteral (const char *num, std::string_view type) {
1859+ if (type.contains (" ::" )) {
1860+ // Not a builtin type
1861+ return std::format (" ({} as {})" , num, type);
1862+ }
1863+ return std::format (" {}_{}" , num, type);
1864+ }
1865+
18501866std::string Converter::getIntegerLiteral (clang::IntegerLiteral *expr,
18511867 bool incl_type,
18521868 const clang::QualType *type) {
@@ -1868,7 +1884,7 @@ std::string Converter::getIntegerLiteral(clang::IntegerLiteral *expr,
18681884 return init;
18691885 }
18701886 }
1871- return std::format ( " {}_{} " , num_as_string.c_str (), type_as_string);
1887+ return getTypedLiteral ( num_as_string.c_str (), type_as_string);
18721888 }
18731889
18741890 return static_cast <std::string>(num_as_string);
@@ -1961,19 +1977,23 @@ bool Converter::VisitStringLiteral(clang::StringLiteral *expr) {
19611977 if (auto *arr_ty = ctx_.getAsConstantArrayType (curr_init_type_.back ())) {
19621978 uint64_t arr_size = arr_ty->getSize ().getZExtValue ();
19631979 if (expr->getString ().empty ()) {
1964- StrCat (std::format (" [0u8 ; {}]" , arr_size));
1980+ StrCat (std::format (" [0 as libc::c_char ; {}]" , arr_size));
19651981 return false ;
19661982 }
19671983 uint64_t pad = arr_size > expr->getString ().size ()
19681984 ? arr_size - expr->getString ().size ()
19691985 : 0 ;
1970- StrCat (token:: kStar ,
1971- std::format ( " b{} " , GetEscapedStringLiteral (expr, pad)));
1986+ StrCat (std::format ( " std::mem::transmute(*b{}) " ,
1987+ GetEscapedStringLiteral (expr, pad)));
19721988 return false ;
19731989 }
1974- StrCat (token::kStar );
1990+ StrCat (std::format (" std::mem::transmute(*b{})" ,
1991+ GetEscapedStringLiteral (expr, 1 )));
1992+ return false ;
19751993 }
1976- StrCat (std::format (" b{}" , GetEscapedStringLiteral (expr, 1 )));
1994+ assert (!expr->getString ().contains (' \0 ' ) &&
1995+ " interior null byte in string literal" );
1996+ StrCat (std::format (" c{}" , GetEscapedStringLiteral (expr, 0 )));
19771997 return false ;
19781998}
19791999
@@ -2056,15 +2076,6 @@ bool Converter::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
20562076 }
20572077 bool dest_pointee_const =
20582078 expr->getType ()->getPointeeType ().isConstQualified ();
2059- if (const auto *member =
2060- clang::dyn_cast<clang::MemberExpr>(sub_expr->IgnoreParenImpCasts ());
2061- member && IsCharArrayFieldFromLibc (member->getMemberDecl ())) {
2062- PushParen paren (*this );
2063- Convert (sub_expr);
2064- StrCat (dest_pointee_const ? " .as_ptr()" : " .as_mut_ptr()" );
2065- StrCat (keyword::kAs , dest_pointee_const ? " *const u8" : " *mut u8" );
2066- break ;
2067- }
20682079 Convert (sub_expr);
20692080 if (clang::isa<clang::StringLiteral>(sub_expr) ||
20702081 clang::isa<clang::PredefinedExpr>(sub_expr)) {
@@ -2752,16 +2763,6 @@ bool Converter::VisitMemberExpr(clang::MemberExpr *expr) {
27522763 return false ;
27532764 }
27542765
2755- // char* fields in libc structs are *mut i8. We represent char* as *mut u8. Do
2756- // the i8 -> u8 conversion here.
2757- if (IsCharPointerFieldFromLibc (member)) {
2758- StrCat (std::format (" ({} as {})" , str,
2759- member->getType ()->getPointeeType ().isConstQualified ()
2760- ? " *const u8"
2761- : " *mut u8" ));
2762- return false ;
2763- }
2764-
27652766 StrCat (str);
27662767 return false ;
27672768}
@@ -3462,11 +3463,11 @@ std::string Converter::GetDefaultAsStringFallback(clang::QualType qual_type) {
34623463 }
34633464
34643465 if (qual_type->isIntegerType () && !qual_type->isEnumeralType ()) {
3465- return std::format ( " 0_{} " , ToString (qual_type));
3466+ return getTypedLiteral ( " 0 " , ToString (qual_type));
34663467 }
34673468
34683469 if (qual_type->isFloatingType ()) {
3469- return std::format (" 0.0_{} " , ToString (qual_type));
3470+ return getTypedLiteral (" 0.0 " , ToString (qual_type));
34703471 }
34713472
34723473 if (auto record = qual_type->getAsRecordDecl ();
@@ -3781,7 +3782,7 @@ void Converter::ConvertFunctionMain(const clang::FunctionDecl *decl,
37813782pub fn main() {{
37823783 let mut args: Vec<Vec<u8>> = std::env::args().map(|arg| arg.as_bytes().to_vec()).collect();
37833784 args.iter_mut().for_each(|v| v.push(0));
3784- let mut argv: Vec<*mut u8 > = args.iter().map(|arg| arg.as_ptr() as *mut u8 ).collect();
3785+ let mut argv: Vec<*mut libc::c_char > = args.iter().map(|arg| arg.as_ptr() as *mut libc::c_char ).collect();
37853786 argv.push(::std::ptr::null_mut());
37863787 unsafe {{
37873788 ::std::process::exit(main_0((argv.len() - 1) as i32, argv.as_mut_ptr()) as i32)
0 commit comments