From a9d62be557a648f254c6850e2a08917686a26976 Mon Sep 17 00:00:00 2001 From: Dan Robertson Date: Wed, 27 Mar 2019 13:00:37 +0000 Subject: Fix LLVM IR generated for C-variadic arguments It is possible to create malformed LLVM IR given variadic arguments that are aggregate types. This occurs due to improper tracking of the current argument in the functions list of arguments. --- src/test/codegen/issue-58881.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/codegen/issue-58881.rs (limited to 'src/test/codegen') diff --git a/src/test/codegen/issue-58881.rs b/src/test/codegen/issue-58881.rs new file mode 100644 index 00000000000..de451324f03 --- /dev/null +++ b/src/test/codegen/issue-58881.rs @@ -0,0 +1,21 @@ +// compile-flags: -C no-prepopulate-passes +// +// only-x86_64 +// ignore-windows + +#![crate_type = "lib"] + +extern "C" { + fn variadic_fn(_: i32, ...); +} + +#[repr(C)] +struct Foo(u8); +#[repr(C)] +struct Bar(u64, u64, u64); + +// Ensure that emit arguments of the correct type. +pub unsafe fn test_call_variadic() { + // CHECK: call void (i32, ...) @variadic_fn(i32 0, i8 {{.*}}, %Bar* {{.*}}) + variadic_fn(0, Foo(0), Bar(0, 0, 0)) +} -- cgit 1.4.1-3-g733a5