OSDN Git Service

New test.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Jan 2001 00:16:42 +0000 (00:16 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Jan 2001 00:16:42 +0000 (00:16 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@39252 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/gcc.c-torture/execute/20010124-1.c [new file with mode: 0644]

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 (file)
index 0000000..5db512b
--- /dev/null
@@ -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;
+}