diff options
| author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-16 00:48:52 +0000 |
|---|---|---|
| committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-09-16 00:48:52 +0000 |
| commit | 2af9221e37abe6540c290595719dedfb72721c6a (patch) | |
| tree | 8d6ab78fd636b37014133303f1681a7382f2be32 /gcc/c-typeck.c | |
| parent | 7aa1e6eb6003e5f91b4d6551e28a02353bfd8d5a (diff) | |
| download | ppe42-gcc-2af9221e37abe6540c290595719dedfb72721c6a.tar.gz ppe42-gcc-2af9221e37abe6540c290595719dedfb72721c6a.zip | |
* c-typeck.c (comptypes): Handle zero-length arrays properly.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45641 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-typeck.c')
| -rw-r--r-- | gcc/c-typeck.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 9d2c8f4d1f8..3298062e8d7 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -505,6 +505,8 @@ comptypes (type1, type2) { tree d1 = TYPE_DOMAIN (t1); tree d2 = TYPE_DOMAIN (t2); + bool d1_variable, d2_variable; + bool d1_zero, d2_zero; val = 1; /* Target types must match incl. qualifiers. */ @@ -513,14 +515,25 @@ comptypes (type1, type2) return 0; /* Sizes must match unless one is missing or variable. */ - if (d1 == 0 || d2 == 0 || d1 == d2 - || TREE_CODE (TYPE_MIN_VALUE (d1)) != INTEGER_CST - || TREE_CODE (TYPE_MIN_VALUE (d2)) != INTEGER_CST - || TREE_CODE (TYPE_MAX_VALUE (d1)) != INTEGER_CST - || TREE_CODE (TYPE_MAX_VALUE (d2)) != INTEGER_CST) + if (d1 == 0 || d2 == 0 || d1 == d2) break; - if (! tree_int_cst_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)) + d1_zero = ! TYPE_MAX_VALUE (d1); + d2_zero = ! TYPE_MAX_VALUE (d2); + + d1_variable = (! d1_zero + && (TREE_CODE (TYPE_MIN_VALUE (d1)) != INTEGER_CST + || TREE_CODE (TYPE_MAX_VALUE (d1)) != INTEGER_CST)); + d2_variable = (! d2_zero + && (TREE_CODE (TYPE_MIN_VALUE (d2)) != INTEGER_CST + || TREE_CODE (TYPE_MAX_VALUE (d2)) != INTEGER_CST)); + + if (d1_variable || d2_variable) + break; + if (d1_zero && d2_zero) + break; + if (d1_zero || d2_zero + || ! tree_int_cst_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)) || ! tree_int_cst_equal (TYPE_MAX_VALUE (d1), TYPE_MAX_VALUE (d2))) val = 0; |

