@@ -1703,6 +1703,10 @@ std::string Converter::GetEscapedStringLiteral(clang::Expr *expr,
17031703
17041704bool Converter::VisitStringLiteral (clang::StringLiteral *expr) {
17051705 StrCat (std::format (" b{}.as_ptr()" , GetEscapedStringLiteral (expr, true )));
1706+ // In C, string literals are char[], in C++ they are const char[]
1707+ if (!expr->getType ().isConstQualified ()) {
1708+ StrCat (" .cast_mut()" );
1709+ }
17061710 return false ;
17071711}
17081712
@@ -1722,27 +1726,27 @@ bool Converter::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
17221726 SetValueFreshness (type);
17231727 break ;
17241728 }
1725- case clang::CastKind::CK_ArrayToPointerDecay:
1726- if (clang::isa<clang::StringLiteral>(sub_expr) ||
1727- clang::isa<clang::PredefinedExpr>(sub_expr)) {
1728- Convert (sub_expr);
1729- if (IsConversionFromStringLiteralToCharPtr (expr)) {
1730- StrCat (" .cast_mut()" );
1731- }
1732- return false ;
1733- }
1729+ case clang::CastKind::CK_ArrayToPointerDecay: {
17341730 // __va_list_tag [1] decays to __va_list_tag *. Just pass through by value
17351731 if (IsVaListType (sub_expr->getType ())) {
17361732 Convert (sub_expr);
17371733 break ;
17381734 }
17391735 Convert (sub_expr);
1740- if (sub_expr->getType ().isConstQualified ()) {
1741- StrCat (keyword_ptr_decay_const_);
1742- } else {
1743- StrCat (keyword_ptr_decay_);
1736+ switch (GetConstCastType (
1737+ expr->getType ()->getPointeeType (),
1738+ sub_expr->getType ()->getAsArrayTypeUnsafe ()->getElementType ())) {
1739+ case ConstCastType::MutableToConst:
1740+ StrCat (" .cast_const()" );
1741+ break ;
1742+ case ConstCastType::ConstToMutable:
1743+ StrCat (" .cast_mut()" );
1744+ break ;
1745+ default :
1746+ break ;
17441747 }
17451748 break ;
1749+ }
17461750 case clang::CastKind::CK_BitCast: {
17471751 PushParen paren (*this );
17481752 Convert (sub_expr);
@@ -1756,8 +1760,19 @@ bool Converter::VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) {
17561760 }
17571761 case clang::CastKind::CK_NoOp: {
17581762 Convert (sub_expr);
1759- if (IsConversionFromStringLiteralToCharPtr (expr)) {
1760- StrCat (" .cast_mut()" );
1763+ if (expr->getType ()->isPointerType () &&
1764+ sub_expr->getType ()->isPointerType ()) {
1765+ switch (GetConstCastType (expr->getType ()->getPointeeType (),
1766+ sub_expr->getType ()->getPointeeType ())) {
1767+ case ConstCastType::MutableToConst:
1768+ StrCat (" .cast_const()" );
1769+ break ;
1770+ case ConstCastType::ConstToMutable:
1771+ StrCat (" .cast_mut()" );
1772+ break ;
1773+ default :
1774+ break ;
1775+ }
17611776 }
17621777 break ;
17631778 }
0 commit comments