aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.co.uk>2000-11-24 17:11:10 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2000-11-24 17:11:10 +0000
commit222de5be4569807aa48134cbe09b60861bea5893 (patch)
tree2d55d7896edfe0fc68ab88e9f51635b350f7bf36 /gcc
parent1510057a32b1646c235117aaed4ab54536d1d18a (diff)
downloadgcc-222de5be4569807aa48134cbe09b60861bea5893.zip
gcc-222de5be4569807aa48134cbe09b60861bea5893.tar.gz
gcc-222de5be4569807aa48134cbe09b60861bea5893.tar.bz2
New testcase
From-SVN: r37709
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog1
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20001124-1.c76
2 files changed, 77 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 237ab8f..ba5dadf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,7 @@
2000-11-24 Bernd Schmidt <bernds@redhat.co.uk>
* gcc.dg/sequence-point-1.c: Add some new tests.
+ * gcc.c-torture/execute/20001124-1.c: New test.
2000-11-24 Nathan Sidwell <nathan@codesourcery.com>
diff --git a/gcc/testsuite/gcc.c-torture/execute/20001124-1.c b/gcc/testsuite/gcc.c-torture/execute/20001124-1.c
new file mode 100644
index 0000000..c0ec8cf
--- /dev/null
+++ b/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 ();
+}