aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>2001-01-24 16:16:42 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-01-24 16:16:42 -0800
commitc499d4d23ae57bc5705db8eb991fa938b6933298 (patch)
treee77e3dd88e295204e82613bce74ff58818fa60e2 /gcc/testsuite
parent304a22ddf1f0ed3bae87d2e9e489eb449e763099 (diff)
downloadgcc-c499d4d23ae57bc5705db8eb991fa938b6933298.zip
gcc-c499d4d23ae57bc5705db8eb991fa938b6933298.tar.gz
gcc-c499d4d23ae57bc5705db8eb991fa938b6933298.tar.bz2
New test.
From-SVN: r39252
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20010124-1.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/20010124-1.c b/gcc/testsuite/gcc.c-torture/execute/20010124-1.c
new file mode 100644
index 0000000..5db512b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20010124-1.c
@@ -0,0 +1,50 @@
+/* Verify that structure return doesn't invoke memcpy on
+ overlapping objects. */
+
+extern void abort (void);
+typedef __SIZE_TYPE__ size_t;
+
+struct S {
+ char stuff[1024];
+};
+
+union U {
+ struct {
+ int space;
+ struct S s;
+ } a;
+ struct {
+ struct S s;
+ int space;
+ } b;
+};
+
+static struct S f(struct S *);
+static void g(union U *);
+
+int main()
+{
+ union U u;
+ u.b.s = f(&u.a.s);
+ u.a.s = f(&u.b.s);
+ g(&u);
+ return 0;
+}
+
+static struct S f(struct S *p)
+{
+ return *p;
+}
+
+static void g(union U *p)
+{
+}
+
+static void *memcpy(void *a, const void *b, size_t len)
+{
+ if (a < b && a+len > b)
+ abort ();
+ if (b < a && b+len > a)
+ abort ();
+ return a;
+}