@@ -916,9 +916,18 @@ bool Converter::VisitReturnStmt(clang::ReturnStmt *stmt) {
916916 return false ;
917917}
918918
919+ void Converter::ConvertCondition (clang::Expr *cond) {
920+ if (!cond->getType ()->isBooleanType ()) {
921+ PushExprKind push (*this , ExprKind::RValue);
922+ Convert (CreateConversionToBool (cond, ctx_));
923+ return ;
924+ }
925+ Convert (cond);
926+ }
927+
919928bool Converter::VisitIfStmt (clang::IfStmt *stmt) {
920929 StrCat (keyword::kIf );
921- Convert (stmt->getCond ());
930+ ConvertCondition (stmt->getCond ());
922931 StrCat (token::kOpenCurlyBracket );
923932 Convert (stmt->getThen ());
924933 StrCat (token::kCloseCurlyBracket );
@@ -938,7 +947,7 @@ bool Converter::VisitIfStmt(clang::IfStmt *stmt) {
938947bool Converter::VisitWhileStmt (clang::WhileStmt *stmt) {
939948 StrCat (" 'loop_:" );
940949 StrCat (keyword::kWhile );
941- Convert (stmt->getCond ());
950+ ConvertCondition (stmt->getCond ());
942951 StrCat (token::kOpenCurlyBracket );
943952 curr_for_inc_.emplace (nullptr );
944953 Convert (stmt->getBody ());
@@ -954,7 +963,7 @@ bool Converter::VisitDoStmt(clang::DoStmt *stmt) {
954963 Convert (stmt->getBody ());
955964 curr_for_inc_.pop ();
956965 StrCat (keyword::kIf , token::kNot , token::kOpenParen );
957- Convert (stmt->getCond ());
966+ ConvertCondition (stmt->getCond ());
958967 StrCat (token::kCloseParen , token::kOpenCurlyBracket , keyword::kBreak ,
959968 token::kSemiColon , token::kCloseCurlyBracket ,
960969 token::kCloseCurlyBracket );
@@ -968,7 +977,7 @@ bool Converter::VisitForStmt(clang::ForStmt *stmt) {
968977 if (stmt->getCond () == nullptr ) {
969978 StrCat (" true" );
970979 } else {
971- Convert (stmt->getCond ());
980+ ConvertCondition (stmt->getCond ());
972981 }
973982 StrCat (token::kOpenCurlyBracket );
974983 curr_for_inc_.emplace (stmt->getInc ());
@@ -1546,7 +1555,8 @@ bool Converter::VisitFloatingLiteral(clang::FloatingLiteral *expr) {
15461555bool Converter::VisitCharacterLiteral (clang::CharacterLiteral *expr) {
15471556 std::string ch = GetEscapedCharLiteral (expr->getValue ());
15481557 ch = " '" + std::move (ch) + " '" ;
1549- StrCat (token::kOpenParen , ch, keyword::kAs , " u8" , token::kCloseParen );
1558+ StrCat (token::kOpenParen , ch, keyword::kAs , ToStringBase (expr->getType ()),
1559+ token::kCloseParen );
15501560 computed_expr_type_ = ComputedExprType::FreshValue;
15511561 return false ;
15521562}
@@ -1664,6 +1674,15 @@ bool Converter::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
16641674 Convert (sub_expr);
16651675 break ;
16661676 case clang::CastKind::CK_IntegralToBoolean:
1677+ if (auto binop = clang::dyn_cast<clang::BinaryOperator>(
1678+ sub_expr->IgnoreParenImpCasts ())) {
1679+ // This already produces bool, no need for != 0
1680+ if (binop->isComparisonOp ()) {
1681+ Convert (sub_expr);
1682+ break ;
1683+ }
1684+ }
1685+
16671686 StrCat (token::kOpenParen );
16681687 Convert (sub_expr);
16691688 StrCat (token::kDiff , token::kZero , token::kCloseParen );
@@ -2875,12 +2894,12 @@ void Converter::ConvertAssignment(clang::Expr *lhs, clang::Expr *rhs,
28752894 curr_init_type_.pop ();
28762895 auto rhs_as_string = ConvertFreshRValue (rhs);
28772896
2878- if (isRValue ()) {
2897+ if (! isVoid ()) {
28792898 StrCat (token::kOpenCurlyBracket );
28802899 }
28812900
28822901 StrCat (lhs_as_string, assign_operator, rhs_as_string);
2883- if (isRValue ()) {
2902+ if (! isVoid ()) {
28842903 StrCat (token::kSemiColon , ConvertRValue (lhs), token::kCloseCurlyBracket );
28852904 }
28862905}
0 commit comments