summaryrefslogtreecommitdiff
path: root/test/CodeGen/variadic-null-win64.c
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2017-01-03 21:23:35 +0000
committerReid Kleckner <rnk@google.com>2017-01-03 21:23:35 +0000
commit4c4d0ce8a1bbf37c5450bf7bb236294257793265 (patch)
tree2635cc146687d035083ab90e5cd618a2f9e6441c /test/CodeGen/variadic-null-win64.c
parent046076f93b93653f1eb8a9c6851cf7f1616d1711 (diff)
downloadclang-4c4d0ce8a1bbf37c5450bf7bb236294257793265.tar.gz
[Win64] Don't widen integer literal zero arguments to unprototyped function calls
The special case to widen the integer literal zero when passed to variadic function calls should only apply to variadic functions, not unprototyped functions. This is consistent with what MSVC does. In this test case, MSVC uses a 4-byte store to pass the 5th argument to 'kr' and an 8-byte store to pass the zero to 'v': void v(int, ...); void kr(); void f(void) { v(1, 2, 3, 4, 0); kr(1, 2, 3, 4, 0); } Aaron Ballman discovered this issue in https://reviews.llvm.org/D28166 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290906 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/variadic-null-win64.c')
-rw-r--r--test/CodeGen/variadic-null-win64.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/test/CodeGen/variadic-null-win64.c b/test/CodeGen/variadic-null-win64.c
index 3e079cbf8e..3b2a3707ba 100644
--- a/test/CodeGen/variadic-null-win64.c
+++ b/test/CodeGen/variadic-null-win64.c
@@ -3,15 +3,21 @@
// Make it possible to pass NULL through variadic functions on platforms where
// NULL has an integer type that is more narrow than a pointer. On such
-// platforms we widen null pointer constants to a pointer-sized integer.
+// platforms we widen null pointer constants passed to variadic functions to a
+// pointer-sized integer. We don't apply this special case to K&R-style
+// unprototyped functions, because MSVC doesn't either.
#define NULL 0
void v(const char *f, ...);
+void kr();
void f(const char *f) {
v(f, 1, 2, 3, NULL);
+ kr(f, 1, 2, 3, 0);
}
// WINDOWS: define void @f(i8* %f)
// WINDOWS: call void (i8*, ...) @v(i8* {{.*}}, i32 1, i32 2, i32 3, i64 0)
+// WINDOWS: call void bitcast (void (...)* @kr to void (i8*, i32, i32, i32, i32)*)(i8* {{.*}}, i32 1, i32 2, i32 3, i32 0)
// LINUX: define void @f(i8* %f)
// LINUX: call void (i8*, ...) @v(i8* {{.*}}, i32 1, i32 2, i32 3, i32 0)
+// LINUX: call void (i8*, i32, i32, i32, i32, ...) bitcast (void (...)* @kr to void (i8*, i32, i32, i32, i32, ...)*)(i8* %1, i32 1, i32 2, i32 3, i32 0)