Skip to content

Commit 7000af4

Browse files
committed
Use counter based naming for overloads
1 parent 9fe2f21 commit 7000af4

41 files changed

Lines changed: 423 additions & 552 deletions

Some content is hidden

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

‎cpp2rust/converter/converter.cpp‎

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,7 +1157,7 @@ std::string Converter::GetCtorName(clang::CXXConstructorDecl *decl) {
11571157
CanUseCopyOrMoveName(decl, name)) {
11581158
return name;
11591159
}
1160-
return GetOverloadedFunctionName(decl);
1160+
return std::format("new_{}", GetCtorIndex(decl));
11611161
}
11621162
return GetNumberOfConvertingCtors(decl->getParent()) != 1
11631163
? std::format("new_{}", GetCtorIndex(decl))
@@ -4106,25 +4106,13 @@ std::string Converter::ConvertVarDefaultInit(clang::QualType qual_type) {
41064106
}
41074107

41084108
std::string
4109-
Converter::GetOverloadedFunctionName(const clang::FunctionDecl *decl) {
4109+
Converter::GetOverloadedFunctionName(const clang::CXXMethodDecl *decl) {
41104110
auto name = GetFunctionBaseName(decl);
41114111
if (auto *conversion = clang::dyn_cast<clang::CXXConversionDecl>(decl)) {
41124112
name = GetConversionName(
41134113
conversion, GetUnsafeTypeAsString(conversion->getConversionType()));
41144114
}
4115-
if (auto *ctor = clang::dyn_cast<clang::CXXConstructorDecl>(decl);
4116-
ctor && !ctor->getParent()->getIdentifier()) {
4117-
name = GetRecordName(ctor->getParent());
4118-
}
4119-
4120-
if (decl->getNumParams() != 0U) {
4121-
name += '_';
4122-
}
4123-
4124-
for (auto *parameter : decl->parameters()) {
4125-
name += GetOverloadParamTypeAsString(parameter->getType());
4126-
name += '_';
4127-
}
4115+
name += std::format("_{}", GetMethodIndex(decl));
41284116

41294117
if (const auto *targs = decl->getTemplateSpecializationArgs()) {
41304118
std::vector<clang::TemplateArgument> args;
@@ -4153,31 +4141,6 @@ Converter::GetOverloadedFunctionName(const clang::FunctionDecl *decl) {
41534141
}
41544142
}
41554143

4156-
auto pred = [](char ch) { return ch != ' ' && ch != '_'; };
4157-
name.erase(std::find_if(name.rbegin(), name.rend(), pred).base(), name.end());
4158-
4159-
if (decl->isVariadic()) {
4160-
name += "_va";
4161-
}
4162-
if (const auto *method = clang::dyn_cast<clang::CXXMethodDecl>(decl)) {
4163-
if (method->isConst()) {
4164-
name += "_const";
4165-
}
4166-
if (method->isVolatile()) {
4167-
name += "_volatile";
4168-
}
4169-
switch (method->getRefQualifier()) {
4170-
case clang::RQ_LValue:
4171-
name += "_lref";
4172-
break;
4173-
case clang::RQ_RValue:
4174-
name += "_rref";
4175-
break;
4176-
case clang::RQ_None:
4177-
break;
4178-
}
4179-
}
4180-
41814144
ToIdentifier(name);
41824145
return name;
41834146
}
@@ -4220,19 +4183,6 @@ std::string Converter::GetUnsafeTypeAsString(clang::QualType qual_type) const {
42204183
return std::string(Trim(type_as_string));
42214184
}
42224185

4223-
std::string
4224-
Converter::GetOverloadParamTypeAsString(clang::QualType type) const {
4225-
auto str = GetUnsafeTypeAsString(type);
4226-
if ((type->isPointerType() || type->isReferenceType()) &&
4227-
type->getPointeeType().isConstQualified()) {
4228-
str += "_const";
4229-
}
4230-
if (type->isRValueReferenceType()) {
4231-
str += "_rv";
4232-
}
4233-
return str;
4234-
}
4235-
42364186
void Converter::ConvertVarInit(clang::QualType qual_type, clang::Expr *expr) {
42374187
if (qual_type->isReferenceType() && !IsReferenceType(expr)) {
42384188
if (llvm::isa<clang::MaterializeTemporaryExpr>(expr->IgnoreImpCasts())) {

‎cpp2rust/converter/converter.h‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ class Converter : public clang::RecursiveASTVisitor<Converter> {
580580
virtual std::string ConvertVarDefaultInit(clang::QualType qual_type);
581581

582582
virtual std::string
583-
GetOverloadedFunctionName(const clang::FunctionDecl *decl);
583+
GetOverloadedFunctionName(const clang::CXXMethodDecl *decl);
584584

585585
virtual std::string GetRecordName(const clang::NamedDecl *decl) const;
586586

@@ -589,8 +589,6 @@ class Converter : public clang::RecursiveASTVisitor<Converter> {
589589

590590
virtual std::string GetUnsafeTypeAsString(clang::QualType qual_type) const;
591591

592-
virtual std::string GetOverloadParamTypeAsString(clang::QualType type) const;
593-
594592
virtual bool NeedsMut(const clang::VarDecl *decl, clang::QualType type,
595593
llvm::StringRef name) const;
596594

‎cpp2rust/converter/converter_lib.cpp‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,24 @@ bool IsOverloadedMethod(const clang::CXXMethodDecl *decl) {
352352
}) > 1;
353353
}
354354

355+
unsigned GetMethodIndex(const clang::CXXMethodDecl *decl) {
356+
const clang::Decl *key = decl->getCanonicalDecl();
357+
if (auto *tmpl = decl->getPrimaryTemplate()) {
358+
key = tmpl->getCanonicalDecl();
359+
}
360+
unsigned index = 0;
361+
for (auto *d : decl->getParent()->decls()) {
362+
if (clang::isa<clang::CXXMethodDecl, clang::FunctionTemplateDecl>(d)) {
363+
++index;
364+
if (d->getCanonicalDecl() == key) {
365+
return index;
366+
}
367+
}
368+
}
369+
assert(false && "method not found in its record");
370+
return 0;
371+
}
372+
355373
const char *GetCopyOrMoveName(const clang::CXXMethodDecl *method) {
356374
if (auto *ctor = clang::dyn_cast<clang::CXXConstructorDecl>(method)) {
357375
if (ctor->isCopyConstructor()) {

‎cpp2rust/converter/converter_lib.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ void ForEachTemplateInstantiatedMethod(
8181

8282
bool IsOverloadedMethod(const clang::CXXMethodDecl *decl);
8383

84+
unsigned GetMethodIndex(const clang::CXXMethodDecl *decl);
85+
8486
const char *GetCopyOrMoveName(const clang::CXXMethodDecl *method);
8587

8688
bool CanUseCopyOrMoveName(const clang::CXXMethodDecl *decl,

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -133,19 +133,6 @@ ConverterRefCount::GetSafeTypeAsString(clang::QualType qual_type) const {
133133
return std::string(Trim(type_as_string));
134134
}
135135

136-
std::string
137-
ConverterRefCount::GetOverloadParamTypeAsString(clang::QualType type) const {
138-
auto str = GetSafeTypeAsString(type);
139-
if ((type->isPointerType() || type->isReferenceType()) &&
140-
type->getPointeeType().isConstQualified()) {
141-
str += "_const";
142-
}
143-
if (type->isRValueReferenceType()) {
144-
str += "_rv";
145-
}
146-
return str;
147-
}
148-
149136
bool ConverterRefCount::NeedsMut(const clang::VarDecl *decl,
150137
clang::QualType type,
151138
llvm::StringRef /*name*/) const {

‎cpp2rust/converter/models/converter_refcount.h‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,6 @@ class ConverterRefCount final : public Converter {
330330

331331
std::string GetSafeTypeAsString(clang::QualType qual_type) const;
332332

333-
std::string GetOverloadParamTypeAsString(clang::QualType type) const override;
334-
335333
bool NeedsMut(const clang::VarDecl *decl, clang::QualType type,
336334
llvm::StringRef /*name*/) const override;
337335

‎tests/unit/out/refcount/10_struct.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,10 @@ pub trait PartialImpl {
211211
fn get(&self) -> Ptr<i32> {
212212
unimplemented!()
213213
}
214-
fn next(&self) -> Ptr<Partial> {
214+
fn next_4(&self) -> Ptr<Partial> {
215215
unimplemented!()
216216
}
217-
fn next_i32(&self, _a0: i32) -> Partial {
217+
fn next_5(&self, _a0: i32) -> Partial {
218218
unimplemented!()
219219
}
220220
}

‎tests/unit/out/refcount/as_const.rs‎

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,39 +49,39 @@ fn main_0() -> i32 {
4949
let s: Value<S> = Rc::new(RefCell::new(S {
5050
v: Rc::new(RefCell::new(7)),
5151
}));
52-
assert!(((({ SImpl::f(&s.as_pointer(),) }) as i32) == (Overload_kMutableOverload as i32)));
53-
assert!(((({ SImpl::f_const(&s.as_pointer(),) }) as i32) == (Overload_kConstOverload as i32)));
52+
assert!(((({ SImpl::f_1(&s.as_pointer(),) }) as i32) == (Overload_kMutableOverload as i32)));
53+
assert!(((({ SImpl::f_2(&s.as_pointer(),) }) as i32) == (Overload_kConstOverload as i32)));
5454
assert!(((({ g_0(s.as_pointer(),) }) as i32) == (Overload_kMutableOverload as i32)));
5555
assert!(((({ g_1(s.as_pointer(),) }) as i32) == (Overload_kConstOverload as i32)));
56-
({ SImpl::value_ref(&s.as_pointer()) }).write(9);
56+
({ SImpl::value_ref_3(&s.as_pointer()) }).write(9);
5757
assert!(((*(*s.borrow()).v.borrow()) == 9));
58-
assert!(((({ SImpl::value_ref_const(&s.as_pointer(),) }).read()) == 9));
58+
assert!(((({ SImpl::value_ref_4(&s.as_pointer(),) }).read()) == 9));
5959
let cs: Ptr<S> = s.as_pointer();
60-
assert!(((({ SImpl::f_const(&cs,) }) as i32) == (Overload_kConstOverload as i32)));
60+
assert!(((({ SImpl::f_2(&cs,) }) as i32) == (Overload_kConstOverload as i32)));
6161
assert!(((*(*cs.upgrade().deref()).v.borrow()) == 9));
6262
let p: Value<Ptr<S>> = Rc::new(RefCell::new((s.as_pointer())));
6363
(*(*(*p.borrow()).upgrade().deref()).v.borrow_mut()) = 11;
6464
assert!(((*(*s.borrow()).v.borrow()) == 11));
65-
assert!(((({ SImpl::f(&(*p.borrow()),) }) as i32) == (Overload_kMutableOverload as i32)));
65+
assert!(((({ SImpl::f_1(&(*p.borrow()),) }) as i32) == (Overload_kMutableOverload as i32)));
6666
return 0;
6767
}
6868
pub trait SImpl {
69-
fn f(&self) -> Overload;
70-
fn f_const(&self) -> Overload;
71-
fn value_ref(&self) -> Ptr<i32>;
72-
fn value_ref_const(&self) -> Ptr<i32>;
69+
fn f_1(&self) -> Overload;
70+
fn f_2(&self) -> Overload;
71+
fn value_ref_3(&self) -> Ptr<i32>;
72+
fn value_ref_4(&self) -> Ptr<i32>;
7373
}
7474
impl SImpl for Ptr<S> {
75-
fn f(&self) -> Overload {
75+
fn f_1(&self) -> Overload {
7676
return Overload_kMutableOverload;
7777
}
78-
fn f_const(&self) -> Overload {
78+
fn f_2(&self) -> Overload {
7979
return Overload_kConstOverload;
8080
}
81-
fn value_ref(&self) -> Ptr<i32> {
81+
fn value_ref_3(&self) -> Ptr<i32> {
8282
return (*(*self).upgrade().deref()).v.as_pointer();
8383
}
84-
fn value_ref_const(&self) -> Ptr<i32> {
84+
fn value_ref_4(&self) -> Ptr<i32> {
8585
return (*(*self).upgrade().deref()).v.as_pointer();
8686
}
8787
}

‎tests/unit/out/refcount/class_templates.rs‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ fn main_0() -> i32 {
346346
});
347347
assert!(
348348
(({ MyContainer_int_Impl::size(&imc.as_pointer(),) }) == 1_usize)
349-
&& ((({ MyContainer_int_Impl::back(&imc.as_pointer(),) }).read()) == 1)
349+
&& ((({ MyContainer_int_Impl::back_4(&imc.as_pointer(),) }).read()) == 1)
350350
);
351351
({ MyContainer_int_Impl::pop_back(&imc.as_pointer()) });
352352
assert!(({ MyContainer_int_Impl::empty(&imc.as_pointer(),) }));
@@ -358,7 +358,7 @@ fn main_0() -> i32 {
358358
});
359359
assert!(
360360
(({ MyContainer_char_Impl::size(&cmc.as_pointer(),) }) == 1_usize)
361-
&& (((({ MyContainer_char_Impl::back(&cmc.as_pointer(),) }).read()) as i32)
361+
&& (((({ MyContainer_char_Impl::back_4(&cmc.as_pointer(),) }).read()) as i32)
362362
== (('a' as u8) as i32))
363363
);
364364
({ MyContainer_char_Impl::pop_back(&cmc.as_pointer()) });
@@ -371,7 +371,8 @@ fn main_0() -> i32 {
371371
});
372372
assert!(
373373
(({ MyContainer_float_Impl::size(&fmc.as_pointer(),) }) == 1_usize)
374-
&& (((({ MyContainer_float_Impl::back(&fmc.as_pointer(),) }).read()) as f64) == 1.0E+0)
374+
&& (((({ MyContainer_float_Impl::back_4(&fmc.as_pointer(),) }).read()) as f64)
375+
== 1.0E+0)
375376
);
376377
({ MyContainer_float_Impl::pop_back(&fmc.as_pointer()) });
377378
assert!(({ MyContainer_float_Impl::empty(&fmc.as_pointer(),) }));
@@ -398,10 +399,10 @@ impl Boxed_long_Impl for Ptr<Boxed_long_> {
398399
pub trait MyContainer_char_Impl {
399400
fn empty(&self) -> bool;
400401
fn size(&self) -> usize;
401-
fn back_const(&self) -> Ptr<u8> {
402+
fn back_3(&self) -> Ptr<u8> {
402403
unimplemented!()
403404
}
404-
fn back(&self) -> Ptr<u8>;
405+
fn back_4(&self) -> Ptr<u8>;
405406
fn pop_back(&self);
406407
fn push_back(&self, item: Ptr<u8>);
407408
}
@@ -412,7 +413,7 @@ impl MyContainer_char_Impl for Ptr<MyContainer_char_> {
412413
fn size(&self) -> usize {
413414
return (*(*(*self).upgrade().deref()).vec_.borrow()).len();
414415
}
415-
fn back(&self) -> Ptr<u8> {
416+
fn back_4(&self) -> Ptr<u8> {
416417
return ((*(*self).upgrade().deref()).vec_.as_pointer() as Ptr<u8>).to_last();
417418
}
418419
fn pop_back(&self) {
@@ -429,10 +430,10 @@ impl MyContainer_char_Impl for Ptr<MyContainer_char_> {
429430
pub trait MyContainer_float_Impl {
430431
fn empty(&self) -> bool;
431432
fn size(&self) -> usize;
432-
fn back_const(&self) -> Ptr<f32> {
433+
fn back_3(&self) -> Ptr<f32> {
433434
unimplemented!()
434435
}
435-
fn back(&self) -> Ptr<f32>;
436+
fn back_4(&self) -> Ptr<f32>;
436437
fn pop_back(&self);
437438
fn push_back(&self, item: Ptr<f32>);
438439
}
@@ -443,7 +444,7 @@ impl MyContainer_float_Impl for Ptr<MyContainer_float_> {
443444
fn size(&self) -> usize {
444445
return (*(*(*self).upgrade().deref()).vec_.borrow()).len();
445446
}
446-
fn back(&self) -> Ptr<f32> {
447+
fn back_4(&self) -> Ptr<f32> {
447448
return ((*(*self).upgrade().deref()).vec_.as_pointer() as Ptr<f32>).to_last();
448449
}
449450
fn pop_back(&self) {
@@ -460,10 +461,10 @@ impl MyContainer_float_Impl for Ptr<MyContainer_float_> {
460461
pub trait MyContainer_int_Impl {
461462
fn empty(&self) -> bool;
462463
fn size(&self) -> usize;
463-
fn back_const(&self) -> Ptr<i32> {
464+
fn back_3(&self) -> Ptr<i32> {
464465
unimplemented!()
465466
}
466-
fn back(&self) -> Ptr<i32>;
467+
fn back_4(&self) -> Ptr<i32>;
467468
fn pop_back(&self);
468469
fn push_back(&self, item: Ptr<i32>);
469470
}
@@ -474,7 +475,7 @@ impl MyContainer_int_Impl for Ptr<MyContainer_int_> {
474475
fn size(&self) -> usize {
475476
return (*(*(*self).upgrade().deref()).vec_.borrow()).len();
476477
}
477-
fn back(&self) -> Ptr<i32> {
478+
fn back_4(&self) -> Ptr<i32> {
478479
return ((*(*self).upgrade().deref()).vec_.as_pointer() as Ptr<i32>).to_last();
479480
}
480481
fn pop_back(&self) {

‎tests/unit/out/refcount/copy_assign.rs‎

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,8 @@ fn main_0() -> i32 {
254254
let n1: Value<NonConstAssign> = Rc::new(RefCell::new(NonConstAssign::new()));
255255
let n2: Value<NonConstAssign> = Rc::new(RefCell::new(NonConstAssign::new()));
256256
let cn: Value<NonConstAssign> = Rc::new(RefCell::new(NonConstAssign::new()));
257-
({ NonConstAssignImpl::operator_assign_PtrNonConstAssign(&n1.as_pointer(), n.as_pointer()) });
258-
({
259-
NonConstAssignImpl::operator_assign_PtrNonConstAssign_const(
260-
&n2.as_pointer(),
261-
cn.as_pointer(),
262-
)
263-
});
257+
({ NonConstAssignImpl::operator_assign_2(&n1.as_pointer(), n.as_pointer()) });
258+
({ NonConstAssignImpl::operator_assign_3(&n2.as_pointer(), cn.as_pointer()) });
264259
assert!(((*(*n1.borrow()).mark.borrow()) == 1));
265260
assert!(((*(*n2.borrow()).mark.borrow()) == 10));
266261
let r: Value<RefQualified> = Rc::new(RefCell::new(RefQualified::new()));
@@ -270,22 +265,16 @@ fn main_0() -> i32 {
270265
return 0;
271266
}
272267
pub trait NonConstAssignImpl {
273-
fn operator_assign_PtrNonConstAssign(&self, o: Ptr<NonConstAssign>) -> Ptr<NonConstAssign>;
274-
fn operator_assign_PtrNonConstAssign_const(
275-
&self,
276-
o: Ptr<NonConstAssign>,
277-
) -> Ptr<NonConstAssign>;
268+
fn operator_assign_2(&self, o: Ptr<NonConstAssign>) -> Ptr<NonConstAssign>;
269+
fn operator_assign_3(&self, o: Ptr<NonConstAssign>) -> Ptr<NonConstAssign>;
278270
}
279271
impl NonConstAssignImpl for Ptr<NonConstAssign> {
280-
fn operator_assign_PtrNonConstAssign(&self, o: Ptr<NonConstAssign>) -> Ptr<NonConstAssign> {
272+
fn operator_assign_2(&self, o: Ptr<NonConstAssign>) -> Ptr<NonConstAssign> {
281273
let __rhs = ((*(*o.upgrade().deref()).mark.borrow()) + 1);
282274
(*(*(*self).upgrade().deref()).mark.borrow_mut()) = __rhs;
283275
return (*self).clone();
284276
}
285-
fn operator_assign_PtrNonConstAssign_const(
286-
&self,
287-
o: Ptr<NonConstAssign>,
288-
) -> Ptr<NonConstAssign> {
277+
fn operator_assign_3(&self, o: Ptr<NonConstAssign>) -> Ptr<NonConstAssign> {
289278
let __rhs = ((*(*o.upgrade().deref()).mark.borrow()) + 10);
290279
(*(*(*self).upgrade().deref()).mark.borrow_mut()) = __rhs;
291280
return (*self).clone();

0 commit comments

Comments
 (0)