From 9fa9a4985356141bc7b7b770ba0f235e9d3e9610 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Thu, 13 Mar 2014 13:18:15 +0000 Subject: [PATCH] [msan] Test for aggregates passing through ellipsis. llvm-svn: 203795 --- compiler-rt/lib/msan/tests/msan_test.cc | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc index 09d24ecf5fee..b38f0538d422 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cc +++ b/compiler-rt/lib/msan/tests/msan_test.cc @@ -2428,6 +2428,41 @@ struct StructByVal { int a, b, c, d, e, f; }; +static void vaargsfn_structbyval(int guard, ...) { + va_list vl; + va_start(vl, guard); + { + StructByVal s = va_arg(vl, StructByVal); + EXPECT_NOT_POISONED(s.a); + EXPECT_POISONED(s.b); + EXPECT_NOT_POISONED(s.c); + EXPECT_POISONED(s.d); + EXPECT_NOT_POISONED(s.e); + EXPECT_POISONED(s.f); + } + { + StructByVal s = va_arg(vl, StructByVal); + EXPECT_NOT_POISONED(s.a); + EXPECT_POISONED(s.b); + EXPECT_NOT_POISONED(s.c); + EXPECT_POISONED(s.d); + EXPECT_NOT_POISONED(s.e); + EXPECT_POISONED(s.f); + } + va_end(vl); +} + +TEST(MemorySanitizer, VAArgStructByVal) { + StructByVal s; + s.a = 1; + s.b = *GetPoisoned(); + s.c = 2; + s.d = *GetPoisoned(); + s.e = 3; + s.f = *GetPoisoned(); + vaargsfn_structbyval(0, s, s); +} + NOINLINE void StructByValTestFunc(struct StructByVal s) { EXPECT_NOT_POISONED(s.a); EXPECT_POISONED(s.b);