aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2002-05-27 20:19:53 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2002-05-27 20:19:53 +0000
commitef72b1d3196beb186a4ec6ca056ad62b4afb78e4 (patch)
tree243f8a5fbbf0a61348c0792038282b2de4bdb2cb /gcc/testsuite
parent630363b4354eb2db2a1451c4c4c97529c42f2021 (diff)
downloadgcc-ef72b1d3196beb186a4ec6ca056ad62b4afb78e4.zip
gcc-ef72b1d3196beb186a4ec6ca056ad62b4afb78e4.tar.gz
gcc-ef72b1d3196beb186a4ec6ca056ad62b4afb78e4.tar.bz2
* gcc.c-torture/execute/pure-1.c: New test.
From-SVN: r53937
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pure-1.c90
2 files changed, 94 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b510c04..2121151 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-05-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.c-torture/execute/pure-1.c: New test.
+
2002-05-27 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/arith-2.c: Remove.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pure-1.c b/gcc/testsuite/gcc.c-torture/execute/pure-1.c
new file mode 100644
index 0000000..a766b93
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pure-1.c
@@ -0,0 +1,90 @@
+/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> 2002-05-27. */
+
+/* Use a different function for each test so the link failures
+ indicate which one is broken. */
+extern void link_error0 (void);
+extern void link_error1 (void);
+extern void link_error2 (void);
+extern void link_error3 (void);
+extern void link_error4 (void);
+extern void link_error5 (void);
+extern void link_error6 (void);
+extern void link_error7 (void);
+
+extern int i;
+
+extern int func0 (int) __attribute__ ((__pure__));
+extern int func1 (int) __attribute__ ((__const__));
+/* GCC should automatically detect attributes for these functions.
+ Don't allow -O3 to inline them. */
+#define ANI __attribute__ ((__noinline__))
+static int ANI func2 (int a) { return i + a; } /* pure */
+static int ANI func3 (int a) { return a * 3; } /* const */
+static int ANI func4 (int a) { return func0(a) + a; } /* pure */
+static int ANI func5 (int a) { return a + func1(a); } /* const */
+static int ANI func6 (int a) { return func2(a) + a; } /* pure */
+static int ANI func7 (int a) { return a + func3(a); } /* const */
+
+int main ()
+{
+ int i[10], r;
+
+ i[0] = 0;
+ r = func0(0);
+ if (i[0])
+ link_error0();
+
+ i[1] = 0;
+ r = func1(0);
+ if (i[1])
+ link_error1();
+
+ i[2] = 0;
+ r = func2(0);
+ if (i[2])
+ link_error2();
+
+ i[3] = 0;
+ r = func3(0);
+ if (i[3])
+ link_error3();
+
+ i[4] = 0;
+ r = func4(0);
+ if (i[4])
+ link_error4();
+
+ i[5] = 0;
+ r = func5(0);
+ if (i[5])
+ link_error5();
+
+ i[6] = 0;
+ r = func6(0);
+ if (i[6])
+ link_error6();
+
+ i[7] = 0;
+ r = func7(0);
+ if (i[7])
+ link_error7();
+
+ return r;
+}
+
+int func0 (int a) { return a - i; } /* pure */
+int func1 (int a) { return a - a; } /* const */
+
+int i = 2;
+
+#ifndef __OPTIMIZE__
+/* Avoid link failures when not optimizing. */
+void link_error0() {}
+void link_error1() {}
+void link_error2() {}
+void link_error3() {}
+void link_error4() {}
+void link_error5() {}
+void link_error6() {}
+void link_error7() {}
+#endif /* ! __OPTIMIZE__ */