aboutsummaryrefslogtreecommitdiff
path: root/SingleSource/Regression/C/gcc-c-torture/execute/20010910-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'SingleSource/Regression/C/gcc-c-torture/execute/20010910-1.c')
-rw-r--r--SingleSource/Regression/C/gcc-c-torture/execute/20010910-1.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/20010910-1.c b/SingleSource/Regression/C/gcc-c-torture/execute/20010910-1.c
new file mode 100644
index 00000000..d0bcc41c
--- /dev/null
+++ b/SingleSource/Regression/C/gcc-c-torture/execute/20010910-1.c
@@ -0,0 +1,59 @@
+/* Test case contributed by Ingo Rohloff <rohloff@in.tum.de>.
+ Code distilled from Linux kernel. */
+
+/* Compile this program with a gcc-2.95.2 using
+ "gcc -O2" and run it. The result will be that
+ rx_ring[1].next == 0 (it should be == 14)
+ and
+ ep.skbuff[4] == 5 (it should be 0)
+*/
+
+extern void abort(void);
+
+struct epic_rx_desc
+{
+ unsigned int next;
+};
+
+struct epic_private
+{
+ struct epic_rx_desc *rx_ring;
+ unsigned int rx_skbuff[5];
+};
+
+static void epic_init_ring(struct epic_private *ep)
+{
+ int i;
+
+ for (i = 0; i < 5; i++)
+ {
+ ep->rx_ring[i].next = 10 + (i+1)*2;
+ ep->rx_skbuff[i] = 0;
+ }
+ ep->rx_ring[i-1].next = 10;
+}
+
+static int check_rx_ring[5] = { 12,14,16,18,10 };
+
+int main(void)
+{
+ struct epic_private ep;
+ struct epic_rx_desc rx_ring[5];
+ int i;
+
+ for (i=0;i<5;i++)
+ {
+ rx_ring[i].next=0;
+ ep.rx_skbuff[i]=5;
+ }
+
+ ep.rx_ring=rx_ring;
+ epic_init_ring(&ep);
+
+ for (i=0;i<5;i++)
+ {
+ if ( rx_ring[i].next != check_rx_ring[i] ) abort();
+ if ( ep.rx_skbuff[i] != 0 ) abort();
+ }
+ return 0;
+}