Skip to content

Commit 78104ef

Browse files
authored
Merge branch 'master' into 2-explicit-cast-expr-key
2 parents 1ee4480 + 839bbc2 commit 78104ef

100 files changed

Lines changed: 1065 additions & 1381 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎cpp2rust/compat/arpa/inet.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@
88
#undef htonl
99
#undef htons
1010

11+
#ifdef __cplusplus
12+
extern "C" {
13+
#endif
1114
uint32_t cpp2rust_ntohl(uint32_t x);
1215
uint16_t cpp2rust_ntohs(uint16_t x);
1316
uint32_t cpp2rust_htonl(uint32_t x);
1417
uint16_t cpp2rust_htons(uint16_t x);
18+
#ifdef __cplusplus
19+
}
20+
#endif
1521

1622
#define ntohl(x) cpp2rust_ntohl(x)
1723
#define ntohs(x) cpp2rust_ntohs(x)

‎cpp2rust/compat/errno.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55

66
#undef errno
77

8+
#ifdef __cplusplus
9+
extern "C" {
10+
#endif
811
int *cpp2rust_errno(void);
12+
#ifdef __cplusplus
13+
}
14+
#endif
915

1016
#define errno (*cpp2rust_errno())

‎cpp2rust/compat/sys/select.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@
88
#undef FD_ISSET
99
#undef FD_ZERO
1010

11+
#ifdef __cplusplus
12+
extern "C" {
13+
#endif
1114
void cpp2rust_fd_set(int fd, fd_set *set);
1215
void cpp2rust_fd_clr(int fd, fd_set *set);
1316
int cpp2rust_fd_isset(int fd, const fd_set *set);
1417
void cpp2rust_fd_zero(fd_set *set);
18+
#ifdef __cplusplus
19+
}
20+
#endif
1521

1622
#define FD_SET(fd, set) cpp2rust_fd_set(fd, set)
1723
#define FD_CLR(fd, set) cpp2rust_fd_clr(fd, set)

‎cpp2rust/converter/converter.cpp‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,15 @@ std::string Converter::ConvertFreshPointer(
219219
return str;
220220
}
221221

222-
std::string Converter::ConvertFreshObject(clang::Expr *expr, std::string_view) {
222+
std::string Converter::ConvertFreshObject(clang::Expr *expr) {
223223
return ConvertFreshPointer(expr);
224224
}
225225

226+
std::string Converter::ConvertPointerReceiver(clang::Expr *arg,
227+
std::string_view param_type) {
228+
return std::format("({} as {})", ConvertFreshObject(arg), param_type);
229+
}
230+
226231
std::string Converter::ConvertTemporaryPointer(
227232
clang::Expr *expr, std::optional<clang::QualType> implicit_convert_to) {
228233
return std::format("&mut {}", ConvertFreshRValue(expr, implicit_convert_to));
@@ -5142,8 +5147,10 @@ std::string Converter::ConvertPlaceholder(clang::Expr *expr, clang::Expr *arg,
51425147

51435148
if (ph_ctx.needs_pointer_receiver()) {
51445149
auto param_type = Mapper::GetParamType(*this, expr, ph_ctx.arg_idx);
5145-
return std::format("({} as {})", ConvertFreshObject(arg, param_type),
5146-
param_type);
5150+
bool borrowed = ph_ctx.access == TranslationRule::Access::kBorrow ||
5151+
ph_ctx.access == TranslationRule::Access::kBorrowMut;
5152+
PushExprKind push(*this, borrowed ? ExprKind::Object : ExprKind::XValue);
5153+
return ConvertPointerReceiver(arg, param_type);
51475154
}
51485155

51495156
if (ph_ctx.needs_object_receiver()) {

‎cpp2rust/converter/converter.h‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,15 +1076,17 @@ class Converter : public clang::RecursiveASTVisitor<Converter> {
10761076
virtual std::string
10771077
ConvertFreshPointer(clang::Expr *expr,
10781078
std::optional<clang::QualType> implicit_convert_to = {});
1079-
// target_ptr_type, when known (e.g. a translation rule's parameter type),
1080-
// is the Rust pointer type the result will be used as.
1081-
virtual std::string ConvertFreshObject(clang::Expr *expr,
1082-
std::string_view target_ptr_type = {});
1079+
virtual std::string ConvertFreshObject(clang::Expr *expr);
1080+
1081+
virtual std::string ConvertPointerReceiver(clang::Expr *arg,
1082+
std::string_view param_type);
1083+
10831084
// A pointer to a new temporary with the value of the prvalue expr, which
10841085
// lives until the end of the statement.
10851086
virtual std::string
10861087
ConvertTemporaryPointer(clang::Expr *expr,
10871088
std::optional<clang::QualType> implicit_convert_to);
1089+
10881090
std::string
10891091
ConvertPointer(clang::Expr *expr,
10901092
std::optional<clang::QualType> implicit_convert_to = {},

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 29 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -392,27 +392,20 @@ std::string ConverterRefCount::ConvertObject(clang::Expr *expr,
392392
return str;
393393
}
394394

395-
std::string
396-
ConverterRefCount::ConvertFreshObject(clang::Expr *expr,
397-
std::string_view target_ptr_type) {
398-
auto shape = ObjectShape::Whole;
399-
if (!target_ptr_type.empty()) {
400-
auto type = expr->getType().getNonReferenceType();
401-
auto pointee = type->isPointerType() ? type->getPointeeType() : type;
402-
if (IsBoxedType(ctx_, pointee) || pointee->isArrayType()) {
403-
auto normalize = [](std::string s) {
404-
std::erase(s, ' ');
405-
for (size_t pos; (pos = s.find("::<")) != std::string::npos;)
406-
s.erase(pos, 2);
407-
return s;
408-
};
409-
if (normalize(std::string(target_ptr_type)) ==
410-
normalize(ConvertPtrType(pointee))) {
411-
shape = ObjectShape::Element;
412-
}
413-
}
414-
}
415-
auto str = ConvertObject(expr, shape);
395+
std::string ConverterRefCount::AsPointerMethod(clang::QualType type) const {
396+
return isObject() && WantsElementPtr() &&
397+
type.getNonReferenceType()->isRecordType()
398+
? ".as_pointer().decay()"
399+
: ".as_pointer()";
400+
}
401+
402+
std::string ConverterRefCount::ConvertPointerReceiver(clang::Expr *arg,
403+
std::string_view) {
404+
return isObject() ? ConvertObject(arg) : ConvertFreshObject(arg);
405+
}
406+
407+
std::string ConverterRefCount::ConvertFreshObject(clang::Expr *expr) {
408+
auto str = ConvertObject(expr);
416409
if (isFresh()) {
417410
return str;
418411
}
@@ -1072,11 +1065,12 @@ void ConverterRefCount::ConvertDeclRefValue(clang::Expr *expr,
10721065

10731066
if (isAddrOf()) {
10741067
if (is_global_value) {
1075-
StrCat(std::format("{}.with(|v| v.as_pointer())", std::move(str)));
1068+
StrCat(std::format("{}.with(|v| v{})", std::move(str),
1069+
AsPointerMethod(decl_t)));
10761070
} else if (is_global_ptr) {
10771071
StrCat(str);
10781072
} else {
1079-
StrCat(str, ".as_pointer()");
1073+
StrCat(str, AsPointerMethod(decl_t));
10801074
}
10811075
computed_expr_type_ = ComputedExprType::FreshPointer;
10821076
return;
@@ -1353,7 +1347,7 @@ bool ConverterRefCount::VisitCallExpr(clang::CallExpr *expr) {
13531347

13541348
if (isAddrOf() && !ty->isReferenceType() && !IsPointerType(ctx_, ty)) {
13551349
PushConversionKind push(*this, ConversionKind::FullRefCount);
1356-
StrCat(BoxValue(std::move(str)), ".as_pointer()");
1350+
StrCat(BoxValue(std::move(str)), AsPointerMethod(ty));
13571351
return false;
13581352
}
13591353

@@ -2090,7 +2084,7 @@ bool ConverterRefCount::VisitMemberExpr(clang::MemberExpr *expr) {
20902084
if (member->getType()->isReferenceType()) {
20912085
computed_expr_type_ = ComputedExprType::Pointer;
20922086
} else {
2093-
StrCat(".as_pointer()");
2087+
StrCat(AsPointerMethod(member->getType()));
20942088
computed_expr_type_ = ComputedExprType::FreshPointer;
20952089
}
20962090
return false;
@@ -2125,8 +2119,8 @@ void ConverterRefCount::ConvertInlineField(clang::MemberExpr *expr) {
21252119
StrCat(std::format("array_field_ptr!({}, {})", ConvertRecordPtr(expr),
21262120
name));
21272121
} else if (IsBoxedType(ctx_, type)) {
2128-
StrCat(std::format("field_ref!({}, {}).as_pointer()",
2129-
ConvertRecordPtr(expr), name));
2122+
StrCat(std::format("field_ref!({}, {}){}", ConvertRecordPtr(expr), name,
2123+
AsPointerMethod(type)));
21302124
} else {
21312125
StrCat(std::format("field_ptr!({}, {})", ConvertRecordPtr(expr), name));
21322126
}
@@ -2838,28 +2832,17 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
28382832
StrCat(GetPointerDerefPrefix(expr->getType()));
28392833
}
28402834

2841-
if (is_inner_boxed && !isObject()) {
2842-
StrCat('(');
2843-
}
2844-
28452835
PushConversionKind push(*this, ConversionKind::Unboxed);
28462836
if (deref && !is_inner_boxed) {
28472837
StrCat(ConvertElemPlace(expr->getArg(0), expr->getArg(1)));
28482838
} else {
2849-
StrCat(std::format("({} as {}).offset({})",
2839+
StrCat(std::format("{}.offset({})",
28502840
ConvertObject(expr->getArg(0), ObjectShape::Element),
2851-
ConvertPtrType(expr->getArg(0)->getType()),
28522841
ConvertSubscriptIndex(expr->getArg(1))));
28532842
}
28542843

2855-
// The pointer to the element is already a pointer to the whole inner
2856-
// container, which as_pointer can't tell from a pointer to its first
2857-
// element without a type.
2858-
if (is_inner_boxed && (!isObject() || WantsElementPtr())) {
2859-
StrCat(".as_pointer()");
2860-
if (!isObject()) {
2861-
StrCat(std::format("as Ptr<{}>)", ToString(expr->getType())));
2862-
}
2844+
if (is_inner_boxed && isObject() && WantsElementPtr()) {
2845+
StrCat(".decay()");
28632846
}
28642847

28652848
if (isAddrOf()) {
@@ -2918,10 +2901,9 @@ std::string ConverterRefCount::ConvertElemPlace(clang::Expr *container,
29182901
return std::format("index!({}, {})", place, ConvertSubscriptIndex(idx));
29192902
}
29202903
}
2921-
auto ptr =
2922-
std::format("({} as {})", ConvertObject(container, ObjectShape::Element),
2923-
ConvertPtrType(container->getType()));
2924-
return std::format("elem!({}, {})", ptr, ConvertSubscriptIndex(idx));
2904+
return std::format("elem!({}, {})",
2905+
ConvertObject(container, ObjectShape::Element),
2906+
ConvertSubscriptIndex(idx));
29252907
}
29262908

29272909
void ConverterRefCount::ConvertFunctionParameters(clang::FunctionDecl *decl) {
@@ -3420,8 +3402,8 @@ void ConverterRefCount::SetUFCSReceiver(clang::Expr *base, bool is_arrow,
34203402
if (IsTemporaryObject(base) && base->getType()->isRecordType() &&
34213403
!IsReferenceType(base->IgnoreImplicit())) {
34223404
PushConversionKind push(*this, ConversionKind::FullRefCount);
3423-
ufcs_receiver_ =
3424-
token::kRef + BoxValue(ConvertRValue(base)) + ".as_pointer()";
3405+
ufcs_receiver_ = token::kRef + BoxValue(ConvertRValue(base)) +
3406+
AsPointerMethod(base->getType());
34253407
return;
34263408
}
34273409
ufcs_receiver_ = token::kRef + (base_is_pointer ? ConvertRValue(base)

‎cpp2rust/converter/models/converter_refcount.h‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,12 +393,17 @@ class ConverterRefCount final : public Converter {
393393
enum class ObjectShape { Whole, Element };
394394
std::string ConvertObject(clang::Expr *expr,
395395
ObjectShape shape = ObjectShape::Whole);
396-
std::string
397-
ConvertFreshObject(clang::Expr *expr,
398-
std::string_view target_ptr_type = {}) override;
396+
std::string ConvertFreshObject(clang::Expr *expr) override;
397+
398+
std::string ConvertPointerReceiver(clang::Expr *arg,
399+
std::string_view param_type) override;
400+
401+
std::string AsPointerMethod(clang::QualType type) const;
402+
399403
std::string ConvertTemporaryPointer(
400404
clang::Expr *expr,
401405
std::optional<clang::QualType> implicit_convert_to) override;
406+
402407
bool WantsElementPtr() const { return object_shape_ == ObjectShape::Element; }
403408
std::string
404409
ConvertFresh(clang::Expr *expr,

‎cpp2rust/converter/rules/expr_matcher.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ using ResolvedDecl =
7575
ResolvedDecl getResolvedDecl(clang::ASTContext &ctx, const clang::Expr *expr,
7676
bool must_resolve) {
7777
expr = RuleDecls::SkipImplicit(expr);
78-
if (llvm::isa<clang::IntegerLiteral>(expr) &&
78+
if (llvm::isa<clang::IntegerLiteral, clang::AtomicExpr>(expr) &&
7979
expr->getBeginLoc().isMacroID()) {
8080
return MacroUsage{
8181
clang::Lexer::getImmediateMacroName(

‎cpp2rust/converter/rules/rule_keys.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ std::optional<ExprKey> getDeclKey(const clang::NamedDecl *decl) {
120120
std::optional<ExprKey> getExprKey(clang::ASTContext &ctx,
121121
const clang::Expr *expr) {
122122
expr = RuleDecls::SkipImplicit(expr);
123-
if (llvm::isa<clang::IntegerLiteral>(expr) &&
123+
if (llvm::isa<clang::IntegerLiteral, clang::AtomicExpr>(expr) &&
124124
expr->getBeginLoc().isMacroID()) {
125125
auto macro = clang::Lexer::getImmediateMacroName(
126126
expr->getBeginLoc(), ctx.getSourceManager(), ctx.getLangOpts());

‎cpp2rust/converter/rules/rules_loader.cpp‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,8 @@ std::string ExprKey(clang::ASTContext &ctx, const clang::Expr *expr) {
477477
if (auto cast = llvm::dyn_cast<clang::ExplicitCastExpr>(expr)) {
478478
return ExprKey(ctx, cast->getSubExpr());
479479
}
480-
if (llvm::isa<clang::IntegerLiteral>(expr) &&
480+
expr = expr->IgnoreParenImpCasts();
481+
if (llvm::isa<clang::IntegerLiteral, clang::AtomicExpr>(expr) &&
481482
expr->getBeginLoc().isMacroID()) {
482483
return clang::Lexer::getImmediateMacroName(
483484
expr->getBeginLoc(), ctx.getSourceManager(), ctx.getLangOpts())
@@ -527,7 +528,7 @@ std::string TypeKey(clang::QualType type) {
527528
type = typeof_type->getUnderlyingExpr()->getType();
528529
}
529530
if (auto alias = type->getAs<clang::TypedefType>();
530-
alias && type.getCanonicalType()->isBuiltinType()) {
531+
alias && !type.getCanonicalType()->getAsTagDecl()) {
531532
return DeclKey(alias->getDecl());
532533
}
533534
if (auto sugar = type->getAs<clang::PredefinedSugarType>()) {

0 commit comments

Comments
 (0)