aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/builtins/20010124-1-lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/execute/builtins/20010124-1-lib.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/execute/builtins/20010124-1-lib.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/builtins/20010124-1-lib.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/builtins/20010124-1-lib.c
new file mode 100644
index 000000000..5f6a7487f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/builtins/20010124-1-lib.c
@@ -0,0 +1,50 @@
+/* Verify that structure return doesn't invoke memcpy on
+ overlapping objects. */
+
+extern void abort (void);
+extern int inside_main;
+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;
+};
+
+struct S f(struct S *p)
+{
+ return *p;
+}
+
+void g(union U *p)
+{
+}
+
+void *memcpy(void *a, const void *b, size_t len)
+{
+ if (inside_main)
+ {
+ if (a < b && a+len > b)
+ abort ();
+ if (b < a && b+len > a)
+ abort ();
+ return a;
+ }
+ else
+ {
+ char *dst = (char *) a;
+ const char *src = (const char *) b;
+ while (len--)
+ *dst++ = *src++;
+ return a;
+ }
+}