summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/string-opt-17.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/string-opt-17.c')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/string-opt-17.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/string-opt-17.c b/gcc/testsuite/gcc.c-torture/execute/string-opt-17.c
new file mode 100644
index 000000000..76a351bfb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/string-opt-17.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 2003 Free Software Foundation.
+
+ Test strcpy optimizations don't evaluate side-effects twice.
+
+ Written by Jakub Jelinek, June 23, 2003. */
+
+typedef __SIZE_TYPE__ size_t;
+extern char *strcpy (char *, const char *);
+extern int memcmp (const void *, const void *, size_t);
+extern void abort (void);
+extern void exit (int);
+
+size_t
+test1 (char *s, size_t i)
+{
+ strcpy (s, "foobarbaz" + i++);
+ return i;
+}
+
+size_t
+check2 (void)
+{
+ static size_t r = 5;
+ if (r != 5)
+ abort ();
+ return ++r;
+}
+
+void
+test2 (char *s)
+{
+ strcpy (s, "foobarbaz" + check2 ());
+}
+
+int
+main (void)
+{
+ char buf[10];
+ if (test1 (buf, 7) != 8 || memcmp (buf, "az", 3))
+ abort ();
+ test2 (buf);
+ if (memcmp (buf, "baz", 4))
+ abort ();
+ exit (0);
+}