diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-08-31 10:51:02 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-08-31 10:51:02 +0200 |
commit | 39f5b724844a28bea3dbb2a5c0b88bdce89ec4cb (patch) | |
tree | 1a75c66b8d5f03337b1d66c958ee7409a6d0df78 /gcc/tree-cfg.c | |
parent | e11c4b7f837bc6b4c22b1f5bf41a9d0608d256be (diff) | |
download | gcc-39f5b724844a28bea3dbb2a5c0b88bdce89ec4cb.zip gcc-39f5b724844a28bea3dbb2a5c0b88bdce89ec4cb.tar.gz gcc-39f5b724844a28bea3dbb2a5c0b88bdce89ec4cb.tar.bz2 |
tree-cfg: Improve gimple switch verification
When looking at the verification, I have noticed a bug in it.
The verification that CASE_HIGH (if present) has the same type as CASE_LOW
is only performed for the case label 2 and higher, case label 1 (the first
one after the default label) isn't checked.
The following patch fixes that, it will uselessly also compare
TREE_TYPE (CASE_LOW (elt)) != elt_type for the case label 1, but I think
that isn't that expensive and helps readability of the code.
2020-08-31 Jakub Jelinek <jakub@redhat.com>
* tree-cfg.c (verify_gimple_switch): If the first non-default case
label has CASE_HIGH, verify it has the same type as CASE_LOW.
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 2bae2ee..2964209 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -4809,17 +4809,7 @@ verify_gimple_switch (gswitch *stmt) return true; } - if (elt_type) - { - if (TREE_TYPE (CASE_LOW (elt)) != elt_type - || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type)) - { - error ("type mismatch for case label in switch statement"); - debug_generic_expr (elt); - return true; - } - } - else + if (! elt_type) { elt_type = TREE_TYPE (CASE_LOW (elt)); if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type)) @@ -4828,6 +4818,13 @@ verify_gimple_switch (gswitch *stmt) return true; } } + if (TREE_TYPE (CASE_LOW (elt)) != elt_type + || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type)) + { + error ("type mismatch for case label in switch statement"); + debug_generic_expr (elt); + return true; + } if (prev_upper_bound) { |