diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-06-22 15:20:14 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-06-22 15:20:14 +0200 |
commit | 92d9c9e705f039f42734139c233202888d2bf01b (patch) | |
tree | f58341cdb5aa5070fd0b0e1c5c546bed9f1f3c79 /gcc | |
parent | ca1f9f22854049d6f9cab5b4bfbc46edbcb5c990 (diff) | |
download | gcc-92d9c9e705f039f42734139c233202888d2bf01b.zip gcc-92d9c9e705f039f42734139c233202888d2bf01b.tar.gz gcc-92d9c9e705f039f42734139c233202888d2bf01b.tar.bz2 |
fold-const: Return corresponding integral type for OFFSET_TYPE in range_check_type [PR101162]
Andrew's recent r12-1608-g2f1686ff70b25fceb04ca2ffc0a450fb682913ef change
to fail verification on various unary and binary operations with OFFSET_TYPE
revealed that e.g. switchconv happily performs multiplications and additions
in OFFSET_TYPE.
2021-06-22 Jakub Jelinek <jakub@redhat.com>
Andrew Pinski <apinski@marvell.com>
PR tree-optimization/101162
* fold-const.c (range_check_type): Handle OFFSET_TYPE like pointer
types.
* g++.dg/opt/pr101162.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fold-const.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr101162.C | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 95673d2..0b33ee9 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -5360,7 +5360,7 @@ range_check_type (tree etype) else return NULL_TREE; } - else if (POINTER_TYPE_P (etype)) + else if (POINTER_TYPE_P (etype) || TREE_CODE (etype) == OFFSET_TYPE) etype = unsigned_type_for (etype); return etype; } diff --git a/gcc/testsuite/g++.dg/opt/pr101162.C b/gcc/testsuite/g++.dg/opt/pr101162.C new file mode 100644 index 0000000..4032189 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr101162.C @@ -0,0 +1,21 @@ +// PR tree-optimization/101162 +// { dg-do compile } +// { dg-options "-O2" } + +struct A { int i1, i2, i3, i4, i5, i6; }; + +int A::* +foo (int i) +{ + switch (i) + { + case 1: return &A::i1; + case 2: return &A::i2; + case 3: return &A::i3; + case 4: return &A::i4; + case 5: return &A::i5; + case 6: return &A::i6; + } + + return 0; +} |