Skip to content

Commit 4e8be46

Browse files
committed
Move std::initializer_list in rules
1 parent 7b0bef4 commit 4e8be46

6 files changed

Lines changed: 25 additions & 7 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4273,11 +4273,11 @@ bool Converter::VisitClassTemplateDecl(clang::ClassTemplateDecl *decl) {
42734273

42744274
bool Converter::VisitCXXStdInitializerListExpr(
42754275
clang::CXXStdInitializerListExpr *expr) {
4276-
if (expr->getSubExpr()->getType()->isArrayType()) {
4277-
// Arrays become Vec's
4278-
StrCat("vec!");
4279-
}
4280-
Convert(expr->getSubExpr());
4276+
auto *backing = expr->getSubExpr();
4277+
auto str = GetMappedAsString(expr, &backing, 1);
4278+
ENSURE(!str.empty());
4279+
StrCat(str);
4280+
SetFreshType(expr->getType());
42814281
return false;
42824282
}
42834283

‎cpp2rust/converter/rules/expr_matcher.cpp‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ ResolvedDecl getResolvedDecl(clang::ASTContext &ctx, const clang::Expr *expr,
9797
list && list->getType()->isRecordType()) {
9898
return AggregateUsage{*RuleKeys::GetTypeKey(list->getType())};
9999
}
100+
if (llvm::isa<clang::CXXStdInitializerListExpr>(expr)) {
101+
return AggregateUsage{*RuleKeys::GetTypeKey(expr->getType())};
102+
}
100103
if (auto construct = llvm::dyn_cast<clang::CXXUnresolvedConstructExpr>(expr);
101104
construct && construct->isListInitialization()) {
102105
return AggregateUsage{*RuleKeys::GetTypeKey(construct->getTypeAsWritten())};
@@ -167,6 +170,8 @@ std::vector<clang::Expr *> getOperands(clang::ASTContext &ctx,
167170
operands.assign(construct->arg_begin(), construct->arg_end());
168171
} else if (auto list = llvm::dyn_cast<clang::InitListExpr>(expr)) {
169172
operands.assign(list->inits().begin(), list->inits().end());
173+
} else if (auto list = llvm::dyn_cast<clang::CXXStdInitializerListExpr>(expr)) {
174+
operands.push_back(list->getSubExpr()->IgnoreImplicit());
170175
} else if (auto member = llvm::dyn_cast<clang::MemberExpr>(expr)) {
171176
auto macro_base =
172177
RuleDecls::GetMacroMemberBase(ctx.getSourceManager(), member);

‎cpp2rust/converter/rules/rule_keys.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ std::optional<ExprKey> getExprKey(clang::ASTContext &ctx,
187187
list && list->getType()->isRecordType()) {
188188
return getConstructorKey(getParent(list->getType()));
189189
}
190+
if (llvm::isa<clang::CXXStdInitializerListExpr>(expr)) {
191+
return getConstructorKey(getParent(expr->getType()));
192+
}
190193
return std::nullopt;
191194
}
192195

‎cpp2rust/converter/rules/rules_loader.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,8 +489,8 @@ std::string ExprKey(clang::ASTContext &ctx, const clang::Expr *expr) {
489489
if (auto construct = llvm::dyn_cast<clang::CXXConstructExpr>(expr)) {
490490
return FunctionKey(construct->getConstructor());
491491
}
492-
if (auto list = llvm::dyn_cast<clang::InitListExpr>(expr)) {
493-
if (auto record = list->getType()->getAsRecordDecl();
492+
if (llvm::isa<clang::InitListExpr, clang::CXXStdInitializerListExpr>(expr)) {
493+
if (auto record = expr->getType()->getAsRecordDecl();
494494
record && !IsUserDefinedDecl(record)) {
495495
return ConstructorKey(ClassKey(record));
496496
}

‎rules/initializer_list/src.cpp‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) 2022-present INESC-ID.
22
// Distributed under the MIT license that can be found in the LICENSE file.
33

4+
#include <cstddef>
45
#include <initializer_list>
56

67
template <typename T1> using t1 = std::initializer_list<T1>;
@@ -12,3 +13,8 @@ typename std::initializer_list<T1>::size_type
1213
f1(const std::initializer_list<T1> &o) {
1314
return o.size();
1415
}
16+
17+
template <typename T1, std::size_t T2>
18+
std::initializer_list<T1> f2(const T1 (&a0)[T2]) {
19+
return std::initializer_list<T1>{a0};
20+
}

‎rules/initializer_list/tgt_unsafe.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ fn t2() -> usize {
1414
unsafe fn f1<T1>(a0: Vec<T1>) -> usize {
1515
a0.len()
1616
}
17+
18+
unsafe fn f2<T1, const T2: usize>(a0: [T1; T2]) -> Vec<T1> {
19+
Vec::from(a0)
20+
}

0 commit comments

Comments
 (0)