Author: johannes Date: Wed Feb 13 12:36:48 2008 New Revision: 47078 URL: http://llvm.org/viewvc/llvm-project?rev=47078&view=rev Log: New test, see comments.
Added: llvm/trunk/test/C++Frontend/2008-02-13-sret.cpp Added: llvm/trunk/test/C++Frontend/2008-02-13-sret.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/C%2B%2BFrontend/2008-02-13-sret.cpp?rev=47078&view=auto ============================================================================== --- llvm/trunk/test/C++Frontend/2008-02-13-sret.cpp (added) +++ llvm/trunk/test/C++Frontend/2008-02-13-sret.cpp Wed Feb 13 12:36:48 2008 @@ -0,0 +1,48 @@ +// RUN: %llvmgxx -S -O0 -emit-llvm %s -o - | grep retval | grep S242 | grep {i32 1} | count 2 + +// Test that all 8 bytes of ret in check242 are copied. llvm-gcc was +// treating S242 as if it were S93, which does not need to have the +// last 4 padding bytes copied. +typedef __builtin_va_list va_list; +typedef unsigned long size_t; +void *memset(void *, int, size_t); +struct S92 { int a:14; } ; + extern struct S92 s92; + + struct S92 check92 () { struct S92 ret; + memset (&ret, 0, sizeof (ret)); + ret.a = s92.a; + return ret; } + +struct S93 { __attribute__((aligned (8))) void * a; } ; + extern struct S93 s93; + struct S93 check93 () { + struct S93 ret; + memset (&ret, 0, sizeof (ret)); + ret.a = s93.a; + return ret; } + +struct S242 { char * a;int b[1]; } ; + extern struct S242 s242; + + struct S242 check242 () { + struct S242 ret; + memset (&ret, 0, sizeof (ret)); + ret.a = s242.a; + ret.b[0] = s242.b[0]; + return ret; } + +void check93va (int z, ...) { + struct S93 arg; + va_list ap; + __builtin_va_start(ap,z); + arg = __builtin_va_arg(ap,struct S93); + __builtin_va_end(ap); } + +void check242va (int z, ...) { +struct S242 arg; +va_list ap; +__builtin_va_start(ap,z); + arg = __builtin_va_arg(ap,struct S242); + __builtin_va_end(ap); } + _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits