Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

codegen_scalar: support tuples with more than one element #2366

Merged
merged 2 commits into from
Apr 14, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions kani-compiler/src/codegen_cprover_gotoc/codegen/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ impl<'tcx> GotocCtx<'tcx> {
/// 1. integers
/// 2. ZST, or transparent structs of one (scalar) value
/// 3. enums that don't carry data
/// 4. unit, 1-ary tuples, or size-0 arrays
/// 4. unit, tuples (may be multi-ary!), or size-0 arrays
/// 5. pointers to an allocation
fn codegen_scalar(&mut self, s: Scalar, ty: Ty<'tcx>, span: Option<&Span>) -> Expr {
debug!(scalar=?s, ?ty, kind=?ty.kind(), ?span, "codegen_scalar");
Expand Down Expand Up @@ -394,15 +394,17 @@ impl<'tcx> GotocCtx<'tcx> {
}
}
}
(s, ty::Tuple(substs)) => {
// here we have tuples of at most one length
if substs.len() == 1 {
let overall_t = self.codegen_ty(ty);
let t = substs[0];
self.codegen_single_variant_single_field(s, span, overall_t, t)
} else {
unreachable!()
}
(Scalar::Int(int), ty::Tuple(_)) => {
tautschnig marked this conversation as resolved.
Show resolved Hide resolved
// A ScalarInt has a u128-typed data field, so the result can never be larger than
// that and the conversion to a uint (of an actual size that may be smaller than
// 128 bits) will succeed.
let int_u128 = int.try_to_uint(int.size()).ok().unwrap();
tautschnig marked this conversation as resolved.
Show resolved Hide resolved
let overall_t = self.codegen_ty(ty);
let expr_int = Expr::int_constant(
int_u128,
Type::unsigned_int(overall_t.sizeof_in_bits(&self.symbol_table)),
);
expr_int.transmute_to(overall_t, &self.symbol_table)
}
(_, ty::Array(_, _)) => {
// we must have zero size array here
Expand Down