summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/divconst-2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/divconst-2.c')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/divconst-2.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/divconst-2.c b/gcc/testsuite/gcc.c-torture/execute/divconst-2.c
new file mode 100644
index 000000000..b58f1bfdd
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/divconst-2.c
@@ -0,0 +1,39 @@
+long
+f (long x)
+{
+ return x / (-0x7fffffffL - 1L);
+}
+
+long
+r (long x)
+{
+ return x % (-0x7fffffffL - 1L);
+}
+
+/* Since we have a negative divisor, this equation must hold for the
+ results of / and %; no specific results are guaranteed. */
+long
+std_eqn (long num, long denom, long quot, long rem)
+{
+ /* For completeness, a check for "ABS (rem) < ABS (denom)" belongs here,
+ but causes trouble on 32-bit machines and isn't worthwhile. */
+ return quot * (-0x7fffffffL - 1L) + rem == num;
+}
+
+long nums[] =
+{
+ -1L, 0x7fffffffL, -0x7fffffffL - 1L
+};
+
+main ()
+{
+ int i;
+
+ for (i = 0;
+ i < sizeof (nums) / sizeof (nums[0]);
+ i++)
+ if (std_eqn (nums[i], -0x7fffffffL - 1L, f (nums[i]), r (nums[i])) == 0)
+ abort ();
+
+ exit (0);
+}