summaryrefslogtreecommitdiffstats
path: root/gcc/c-typeck.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-16 00:48:52 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-16 00:48:52 +0000
commit2af9221e37abe6540c290595719dedfb72721c6a (patch)
tree8d6ab78fd636b37014133303f1681a7382f2be32 /gcc/c-typeck.c
parent7aa1e6eb6003e5f91b4d6551e28a02353bfd8d5a (diff)
downloadppe42-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.c25
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;
OpenPOWER on IntegriCloud