Skip to content

Commit 6a9412d

Browse files
committed
Fix arrity and deduction for aggregate
1 parent b15abc4 commit 6a9412d

7 files changed

Lines changed: 31 additions & 14 deletions

File tree

‎cpp2rust/converter/converter.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3625,6 +3625,7 @@ bool Converter::VisitInitListExpr(clang::InitListExpr *expr) {
36253625
SetFreshType(qual_type);
36263626
return false;
36273627
}
3628+
assert(IsUserDefinedDecl(record) && "aggregate list without a rule");
36283629

36293630
StrCat(GetUnsafeTypeAsString(qual_type));
36303631
PushBrace brace(*this);

‎cpp2rust/converter/models/converter_refcount.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,6 +1901,7 @@ bool ConverterRefCount::VisitInitListExpr(clang::InitListExpr *expr) {
19011901
return false;
19021902
}
19031903
}
1904+
assert(IsUserDefinedDecl(record) && "aggregate list without a rule");
19041905

19051906
if (record->isUnion()) {
19061907
auto *field = expr->getInitializedFieldInUnion();

‎cpp2rust/converter/rules/expr_matcher.cpp‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ std::vector<clang::Expr *> getOperands(clang::ASTContext &ctx,
170170
operands.assign(construct->arg_begin(), construct->arg_end());
171171
} else if (auto list = llvm::dyn_cast<clang::InitListExpr>(expr)) {
172172
operands.assign(list->inits().begin(), list->inits().end());
173-
} else if (auto list = llvm::dyn_cast<clang::CXXStdInitializerListExpr>(expr)) {
173+
} else if (auto list =
174+
llvm::dyn_cast<clang::CXXStdInitializerListExpr>(expr)) {
174175
operands.push_back(list->getSubExpr()->IgnoreImplicit());
175176
} else if (auto member = llvm::dyn_cast<clang::MemberExpr>(expr)) {
176177
auto macro_base =
@@ -256,7 +257,10 @@ clang::TemplateArgumentListInfo getResultArgs(clang::Sema &sema,
256257
clang::TemplateArgumentListInfo explicit_args(loc, loc);
257258
llvm::SmallBitVector deducible;
258259
sema.MarkDeducedTemplateParameters(rule, deducible);
259-
if (deducible.all()) {
260+
bool aggregate =
261+
llvm::isa<clang::InitListExpr, clang::CXXStdInitializerListExpr>(
262+
RuleDecls::SkipImplicit(use));
263+
if (deducible.all() && !aggregate) {
260264
return explicit_args;
261265
}
262266
auto params = rule->getTemplateParameters();
@@ -270,7 +274,7 @@ clang::TemplateArgumentListInfo getResultArgs(clang::Sema &sema,
270274
return explicit_args;
271275
}
272276
auto last = static_cast<unsigned>(deducible.find_last_unset());
273-
for (unsigned i = 0; i <= last; ++i) {
277+
for (unsigned i = 0; i < params->size() && i <= last; ++i) {
274278
auto param = params->getParam(i);
275279
if (param->isParameterPack() || (*deduced)[i].isNull()) {
276280
break;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn main() {
1111
std::process::exit(main_0());
1212
}
1313
fn main_0() -> i32 {
14-
let v: Value<Vec<i32>> = Rc::new(RefCell::new(vec![1, 2]));
14+
let v: Value<Vec<i32>> = Rc::new(RefCell::new(Vec::from([1, 2])));
1515
let f: Value<FnPtr<fn() -> i32>> = Rc::new(RefCell::new(lambda!(
1616
{
1717
let v: Value<Vec<i32>> = Rc::new(RefCell::new((*v.borrow()).clone()));

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ pub fn main() {
159159
fn main_0() -> i32 {
160160
let mut w: Wrapped_int_ = Wrapped_int_ { v: 2 };
161161
assert!((w.v == 2));
162-
let lts: Value<Vec<Lt>> = Rc::new(RefCell::new(vec![Lt { v: 3 }, Lt { v: 1 }, Lt { v: 2 }]));
162+
let lts: Value<Vec<Lt>> = Rc::new(RefCell::new(Vec::from([
163+
Lt { v: 3 },
164+
Lt { v: 1 },
165+
Lt { v: 2 },
166+
])));
163167
{
164168
let __n = RandomAccessIterator::Vec((lts.as_pointer() as Ptr<Lt>).to_end())
165169
.iter_distance(&RandomAccessIterator::Vec((lts.as_pointer() as Ptr<Lt>)));
@@ -191,7 +195,11 @@ fn main_0() -> i32 {
191195
(({ (*lts.borrow())[0_usize].v } == 1) && ({ (*lts.borrow())[1_usize].v } == 2))
192196
&& ({ (*lts.borrow())[2_usize].v } == 3)
193197
);
194-
let eqs: Value<Vec<Eq>> = Rc::new(RefCell::new(vec![Eq { v: 1 }, Eq { v: 2 }, Eq { v: 3 }]));
198+
let eqs: Value<Vec<Eq>> = Rc::new(RefCell::new(Vec::from([
199+
Eq { v: 1 },
200+
Eq { v: 2 },
201+
Eq { v: 3 },
202+
])));
195203
let mut two: Eq = Eq { v: 2 };
196204
let mut nine: Eq = Eq { v: 9 };
197205
assert!(
@@ -219,8 +227,11 @@ fn main_0() -> i32 {
219227
__it
220228
} == RandomAccessIterator::Vec((eqs.as_pointer() as Ptr<Eq>).to_end())
221229
);
222-
let cmps: Value<Vec<Cmp>> =
223-
Rc::new(RefCell::new(vec![Cmp { v: 3 }, Cmp { v: 1 }, Cmp { v: 2 }]));
230+
let cmps: Value<Vec<Cmp>> = Rc::new(RefCell::new(Vec::from([
231+
Cmp { v: 3 },
232+
Cmp { v: 1 },
233+
Cmp { v: 2 },
234+
])));
224235
{
225236
let __n = RandomAccessIterator::Vec((cmps.as_pointer() as Ptr<Cmp>).to_end())
226237
.iter_distance(&RandomAccessIterator::Vec((cmps.as_pointer() as Ptr<Cmp>)));
@@ -264,7 +275,7 @@ fn main_0() -> i32 {
264275
.with(|__s| __s.v)
265276
== 3)
266277
);
267-
let frees: Value<Vec<Free>> = Rc::new(RefCell::new(vec![Free { v: 2 }, Free { v: 1 }]));
278+
let frees: Value<Vec<Free>> = Rc::new(RefCell::new(Vec::from([Free { v: 2 }, Free { v: 1 }])));
268279
{
269280
let __n = RandomAccessIterator::Vec((frees.as_pointer() as Ptr<Free>).to_end())
270281
.iter_distance(&RandomAccessIterator::Vec(

‎tests/unit/out/unsafe/lambda_capture_library_types.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pub fn main() {
1313
}
1414
}
1515
unsafe fn main_0() -> i32 {
16-
let mut v: Vec<i32> = vec![1, 2];
16+
let mut v: Vec<i32> = Vec::from([1, 2]);
1717
let mut f: FnPtr<fn() -> i32> = lambda_unsafe!(
1818
{
1919
let v: Vec<i32> = v.clone();

‎tests/unit/out/unsafe/operator_traits.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ pub fn main() {
137137
unsafe fn main_0() -> i32 {
138138
let mut w: Wrapped_int_ = Wrapped_int_ { v: 2 };
139139
assert!(((w.v) == (2)));
140-
let mut lts: Vec<Lt> = vec![Lt { v: 3 }, Lt { v: 1 }, Lt { v: 2 }];
140+
let mut lts: Vec<Lt> = Vec::from([Lt { v: 3 }, Lt { v: 1 }, Lt { v: 2 }]);
141141
{
142142
let __n = UnsafeRandomAccessIterator::Vec(lts.as_mut_ptr().add(lts.len()))
143143
.iter_distance(&UnsafeRandomAccessIterator::Vec(lts.as_mut_ptr()));
@@ -162,7 +162,7 @@ unsafe fn main_0() -> i32 {
162162
assert!(
163163
(((lts[(0_usize)].v) == (1)) && ((lts[(1_usize)].v) == (2))) && ((lts[(2_usize)].v) == (3))
164164
);
165-
let mut eqs: Vec<Eq> = vec![Eq { v: 1 }, Eq { v: 2 }, Eq { v: 3 }];
165+
let mut eqs: Vec<Eq> = Vec::from([Eq { v: 1 }, Eq { v: 2 }, Eq { v: 3 }]);
166166
let mut two: Eq = Eq { v: 2 };
167167
let mut nine: Eq = Eq { v: 9 };
168168
assert!(
@@ -189,7 +189,7 @@ unsafe fn main_0() -> i32 {
189189
__it
190190
} == UnsafeRandomAccessIterator::Vec(eqs.as_mut_ptr().add(eqs.len()))
191191
);
192-
let mut cmps: Vec<Cmp> = vec![Cmp { v: 3 }, Cmp { v: 1 }, Cmp { v: 2 }];
192+
let mut cmps: Vec<Cmp> = Vec::from([Cmp { v: 3 }, Cmp { v: 1 }, Cmp { v: 2 }]);
193193
{
194194
let __n = UnsafeRandomAccessIterator::Vec(cmps.as_mut_ptr().add(cmps.len()))
195195
.iter_distance(&UnsafeRandomAccessIterator::Vec(cmps.as_mut_ptr()));
@@ -226,7 +226,7 @@ unsafe fn main_0() -> i32 {
226226
.iter_deref())
227227
.v) == (3))
228228
);
229-
let mut frees: Vec<Free> = vec![Free { v: 2 }, Free { v: 1 }];
229+
let mut frees: Vec<Free> = Vec::from([Free { v: 2 }, Free { v: 1 }]);
230230
{
231231
let __n = UnsafeRandomAccessIterator::Vec(frees.as_mut_ptr().add(frees.len()))
232232
.iter_distance(&UnsafeRandomAccessIterator::Vec(frees.as_mut_ptr()));

0 commit comments

Comments
 (0)