Skip to content

Commit 7e0deb1

Browse files
committed
Use default string literal instead of <S>::default()
1 parent e339ed8 commit 7e0deb1

174 files changed

Lines changed: 856 additions & 639 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/converter/converter.cpp‎

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4048,16 +4048,9 @@ std::string Converter::GetDefaultAsStringFallback(clang::QualType qual_type) {
40484048
return getTypedLiteral("0.0", ToString(qual_type));
40494049
}
40504050

4051-
if (auto record = qual_type->getAsRecordDecl();
4052-
record && in_const_initializer_) {
4053-
if (auto cxx = clang::dyn_cast<clang::CXXRecordDecl>(record)) {
4054-
ENSURE(GetUserDefinedDefaultConstructor(cxx) == nullptr &&
4055-
"Default initializing globals using default constructor is not "
4056-
"supported");
4057-
}
4058-
Buffer buf(*this);
4059-
EmitDefaultStructLiteral(record);
4060-
return std::move(buf).str();
4051+
if (auto literal = GetDefaultStructLiteralAsString(qual_type);
4052+
!literal.empty()) {
4053+
return literal;
40614054
}
40624055

40634056
if (auto record = qual_type->getAsRecordDecl()) {
@@ -4079,6 +4072,21 @@ std::string Converter::GetDefaultAsStringFallback(clang::QualType qual_type) {
40794072
return std::format("<{}>::default()", ToString(qual_type));
40804073
}
40814074

4075+
std::string
4076+
Converter::GetDefaultStructLiteralAsString(clang::QualType qual_type) {
4077+
auto *record = qual_type->getAsRecordDecl();
4078+
if (record == nullptr || record->isUnion()) {
4079+
return {};
4080+
}
4081+
if (auto *cxx = clang::dyn_cast<clang::CXXRecordDecl>(record);
4082+
cxx && GetUserDefinedDefaultConstructor(cxx)) {
4083+
return {};
4084+
}
4085+
Buffer buf(*this);
4086+
EmitDefaultStructLiteral(record);
4087+
return std::move(buf).str();
4088+
}
4089+
40824090
std::string Converter::ConvertVarDefaultInit(clang::QualType qual_type) {
40834091
return GetDefaultAsString(qual_type);
40844092
}

‎cpp2rust/converter/converter.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,9 @@ class Converter : public clang::RecursiveASTVisitor<Converter> {
552552

553553
virtual std::string GetDefaultAsStringFallback(clang::QualType qual_type);
554554

555+
virtual std::string
556+
GetDefaultStructLiteralAsString(clang::QualType qual_type);
557+
555558
virtual std::string ConvertVarDefaultInit(clang::QualType qual_type);
556559

557560
virtual std::string

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2187,7 +2187,22 @@ std::string ConverterRefCount::GetDefaultAsString(clang::QualType qual_type) {
21872187

21882188
std::string
21892189
ConverterRefCount::GetDefaultAsStringFallback(clang::QualType qual_type) {
2190-
return std::format("<{}>::default()", ToString(qual_type));
2190+
if (qual_type->isReferenceType()) {
2191+
return Converter::GetDefaultAsStringFallback(qual_type);
2192+
}
2193+
2194+
std::string unboxed;
2195+
{
2196+
PushConversionKind push(*this, ConversionKind::Unboxed);
2197+
unboxed = Converter::GetDefaultAsStringFallback(qual_type);
2198+
}
2199+
return BoxValue(std::move(unboxed));
2200+
}
2201+
2202+
std::string
2203+
ConverterRefCount::GetDefaultStructLiteralAsString(clang::QualType qual_type) {
2204+
PushConversionKind push(*this, ConversionKind::FullRefCount);
2205+
return Converter::GetDefaultStructLiteralAsString(qual_type);
21912206
}
21922207

21932208
std::string

‎cpp2rust/converter/models/converter_refcount.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ class ConverterRefCount final : public Converter {
182182

183183
std::string GetDefaultAsStringFallback(clang::QualType qual_type) override;
184184

185+
std::string
186+
GetDefaultStructLiteralAsString(clang::QualType qual_type) override;
187+
185188
std::string ConvertVarDefaultInit(clang::QualType qual_type) override;
186189

187190
std::vector<const char *>

‎tests/multi-file/cross_tu_tag_collision/out/refcount/cross_tu_tag_collision.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ impl ByteRepr for widget {
3131
}
3232
}
3333
pub fn a_value_0() -> i32 {
34-
let w: Value<widget> = <Value<widget>>::default();
34+
let w: Value<widget> = Rc::new(RefCell::new(widget {
35+
id: Rc::new(RefCell::new(0_i32)),
36+
}));
3537
(*(*w.borrow()).id.borrow_mut()) = 11;
3638
return (*(*w.borrow()).id.borrow());
3739
}

‎tests/multi-file/cross_tu_tag_collision/out/unsafe/cross_tu_tag_collision.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub struct widget {
1212
pub id: i32,
1313
}
1414
pub unsafe fn a_value_0() -> i32 {
15-
let mut w: widget = <widget>::default();
15+
let mut w: widget = widget { id: 0_i32 };
1616
w.id = 11;
1717
return w.id;
1818
}

‎tests/multi-file/defaulted_move_cross_tu/out/refcount/defaulted_move_cross_tu.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,7 @@ impl Default for S {
4141
fn default() -> Self {
4242
S {
4343
v: Rc::new(RefCell::new(Default::default())),
44-
n: Rc::new(RefCell::new(
45-
(0..2).map(|_| <i32>::default()).collect::<Box<[i32]>>(),
46-
)),
44+
n: Rc::new(RefCell::new((0..2).map(|_| 0_i32).collect::<Box<[i32]>>())),
4745
}
4846
}
4947
}

‎tests/multi-file/template_method_late_instantiation/out/refcount/template_method_late_instantiation.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ pub fn main() {
4444
std::process::exit(main_0());
4545
}
4646
fn main_0() -> i32 {
47-
let p: Value<S_int_> = Rc::new(RefCell::new(<S_int_>::default()));
47+
let p: Value<S_int_> = Rc::new(RefCell::new(S_int_ {
48+
x: Rc::new(RefCell::new(0)),
49+
}));
4850
({ S_int_Impl::set(&p.as_pointer(), 3) });
4951
assert!((({ f_0((p.as_pointer()),) }) == 3));
5052
return 0;

‎tests/multi-file/template_method_late_instantiation/out/unsafe/template_method_late_instantiation.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub fn main() {
2828
}
2929
}
3030
unsafe fn main_0() -> i32 {
31-
let mut p: S_int_ = <S_int_>::default();
31+
let mut p: S_int_ = S_int_ { x: 0 };
3232
(unsafe { S_int_::set(&mut p, 3) });
3333
assert!(((unsafe { f_0((&mut p as *mut S_int_),) }) == (3)));
3434
return 0;

‎tests/ub/out/refcount/fd_use_after_close.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ fn main_0() -> i32 {
3131
}
3232
}));
3333
FdRegistry::close((*fd.borrow()));
34-
let buf: Value<Box<[u8]>> = Rc::new(RefCell::new(
35-
(0..4).map(|_| <u8>::default()).collect::<Box<[u8]>>(),
36-
));
34+
let buf: Value<Box<[u8]>> = Rc::new(RefCell::new((0..4).map(|_| 0_u8).collect::<Box<[u8]>>()));
3735
let n: Value<isize> = Rc::new(RefCell::new(
3836
match FdRegistry::with_fd((*fd.borrow()), |__fd| {
3937
((buf.as_pointer() as Ptr<u8>) as Ptr<u8>)

0 commit comments

Comments
 (0)