Skip to content

Commit 5864ed7

Browse files
committed
Fix string matcher to accept size_type rules for each container
1 parent 4d62cdd commit 5864ed7

5 files changed

Lines changed: 30 additions & 1 deletion

File tree

‎cpp2rust/converter/printer.cpp‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,14 @@ std::string ToString(clang::ASTContext &ctx, clang::QualType qual_type,
134134
}
135135
if (const auto *typedef_type = t->getAs<clang::TypedefType>()) {
136136
if (t.getCanonicalType()->isBuiltinType()) {
137-
return typedef_type->getDecl()->getNameAsString();
137+
auto decl = typedef_type->getDecl();
138+
if (auto record =
139+
clang::dyn_cast<clang::RecordDecl>(decl->getDeclContext());
140+
record && !record->isDependentContext()) {
141+
return ToString(ctx, ctx.getCanonicalTagType(record)) +
142+
"::" + decl->getNameAsString();
143+
}
144+
return decl->getNameAsString();
138145
}
139146
} else if (const auto *predef = t->getAs<clang::PredefinedSugarType>()) {
140147
return predef->getIdentifier()->getName().str();

‎cpp2rust/converter/rules/rules_loader.cpp‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,13 @@ class RuleUsageCollector
153153
return;
154154
}
155155
AddKey(TypeKey(type));
156+
if (const auto *alias =
157+
llvm::dyn_cast<clang::TypedefType>(type.getTypePtr())) {
158+
if (const auto *record = llvm::dyn_cast<clang::RecordDecl>(
159+
alias->getDecl()->getDeclContext())) {
160+
AddKey(ClassKey(record));
161+
}
162+
}
156163
if (auto desugared = type.getSingleStepDesugaredType(ctx_);
157164
desugared != type) {
158165
if (const auto *spec = llvm::dyn_cast<clang::TemplateSpecializationType>(
@@ -454,6 +461,8 @@ void PragmaHandler::HandlePragma(clang::Preprocessor &PP,
454461
auto &ctx = CI_.getASTContext();
455462
auto &src_mgr = ctx.getSourceManager();
456463

464+
CI_.getSema().PerformPendingInstantiations();
465+
457466
std::unordered_set<std::string> keys;
458467
RuleUsageCollector collector(CI_.getSema(), keys);
459468
collector.TraverseDecl(ctx.getTranslationUnitDecl());

‎cpp2rust/converter/rules/string_matcher.cpp‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,12 @@ Match<TranslationRule::TypeRule> Find(clang::ASTContext &ctx,
372372
<< ", result: " << res.first->type_info.type << '\n';
373373
return res;
374374
}
375+
if (auto alias = type->getAs<clang::TypedefType>();
376+
alias && type.getCanonicalType()->isBuiltinType() &&
377+
clang::isa<clang::RecordDecl>(alias->getDecl()->getDeclContext())) {
378+
log() << "search type " << sugared << ", result: None\n";
379+
return Find(ctx, alias->getDecl()->getUnderlyingType());
380+
}
375381
auto desugared = Printer::ToString(ctx, type);
376382
if (desugared == sugared) {
377383
log() << "search type " << desugared << ", result: None\n";

‎rules/vector/src.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ using t7 = typename std::vector<T1, T2>::const_iterator;
2424

2525
template <typename T1> using t8 = typename std::vector<T1>::size_type;
2626

27+
template <typename T1, typename T2 = std::allocator<T1>>
28+
using t9 = typename std::vector<T1, T2>::size_type;
29+
2730
template <typename T1>
2831
typename std::vector<T1>::iterator
2932
f1(std::vector<T1> &o, typename std::vector<T1>::const_iterator it) {

‎rules/vector/tgt_unsafe.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ fn t8() -> usize {
3737
0_usize
3838
}
3939

40+
fn t9() -> usize {
41+
0_usize
42+
}
43+
4044
unsafe fn f1<T1>(a0: &mut Vec<T1>, a1: *const T1) -> *const T1 {
4145
let pos = a1.offset_from(a0.as_ptr()) as usize;
4246
a0.remove(pos);

0 commit comments

Comments
 (0)