aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20001124-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20001124-1.c')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20001124-1.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20001124-1.c b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20001124-1.c
new file mode 100644
index 000000000..c0ec8cf04
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.c-torture/execute/20001124-1.c
@@ -0,0 +1,76 @@
+
+struct inode {
+ long long i_size;
+ struct super_block *i_sb;
+};
+
+struct file {
+ long long f_pos;
+};
+
+struct super_block {
+ int s_blocksize;
+ unsigned char s_blocksize_bits;
+ int s_hs;
+};
+
+static char *
+isofs_bread(unsigned int block)
+{
+ if (block)
+ abort ();
+ exit(0);
+}
+
+static int
+do_isofs_readdir(struct inode *inode, struct file *filp)
+{
+ int bufsize = inode->i_sb->s_blocksize;
+ unsigned char bufbits = inode->i_sb->s_blocksize_bits;
+ unsigned int block, offset;
+ char *bh = 0;
+ int hs;
+
+ if (filp->f_pos >= inode->i_size)
+ return 0;
+
+ offset = filp->f_pos & (bufsize - 1);
+ block = filp->f_pos >> bufbits;
+ hs = inode->i_sb->s_hs;
+
+ while (filp->f_pos < inode->i_size) {
+ if (!bh)
+ bh = isofs_bread(block);
+
+ hs += block << bufbits;
+
+ if (hs == 0)
+ filp->f_pos++;
+
+ if (offset >= bufsize)
+ offset &= bufsize - 1;
+
+ if (*bh)
+ filp->f_pos++;
+
+ filp->f_pos++;
+ }
+ return 0;
+}
+
+struct super_block s;
+struct inode i;
+struct file f;
+
+int
+main(int argc, char **argv)
+{
+ s.s_blocksize = 512;
+ s.s_blocksize_bits = 9;
+ i.i_size = 2048;
+ i.i_sb = &s;
+ f.f_pos = 0;
+
+ do_isofs_readdir(&i,&f);
+ abort ();
+}