diff options
author | Marek Polacek <polacek@redhat.com> | 2016-06-06 15:50:23 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2016-06-06 15:50:23 +0000 |
commit | 5545a9071573a58e858860724cb47ed7a5ef440d (patch) | |
tree | 4f2fdbd263f073b2a4d3d06e36e334555cc43fba /gcc/c | |
parent | 94229fb6dcd63c2dfaa6c68d6a03ada2697be729 (diff) | |
download | gcc-5545a9071573a58e858860724cb47ed7a5ef440d.zip gcc-5545a9071573a58e858860724cb47ed7a5ef440d.tar.gz gcc-5545a9071573a58e858860724cb47ed7a5ef440d.tar.bz2 |
c-typeck.c (comptypes_internal): Handle comparisons of INTEGER_TYPE, FIXED_POINT_TYPE, and REAL_TYPE nodes.
* c-typeck.c (comptypes_internal): Handle comparisons of
INTEGER_TYPE, FIXED_POINT_TYPE, and REAL_TYPE nodes. Don't check
TYPE_REF_CAN_ALIAS_ALL.
* c-c++-common/attr-may-alias-1.c: New test.
* c-c++-common/attr-may-alias-2.c: New test.
* gcc.dg/pr39464.c: Turn dg-warning into dg-bogus.
From-SVN: r237137
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 24 |
2 files changed, 27 insertions, 3 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 1262c82..f0b03d2 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2016-06-06 Marek Polacek <polacek@redhat.com> + + * c-typeck.c (comptypes_internal): Handle comparisons of + INTEGER_TYPE, FIXED_POINT_TYPE, and REAL_TYPE nodes. Don't check + TYPE_REF_CAN_ALIAS_ALL. + 2016-06-03 Chung-Lin Tang <cltang@codesourcery.com> * c-typeck.c (c_finish_omp_clauses): Mark OpenACC reduction diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 0ff28f2..cee566f 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -1105,10 +1105,28 @@ comptypes_internal (const_tree type1, const_tree type2, bool *enum_and_int_p, switch (TREE_CODE (t1)) { + case INTEGER_TYPE: + case FIXED_POINT_TYPE: + case REAL_TYPE: + /* With these nodes, we can't determine type equivalence by + looking at what is stored in the nodes themselves, because + two nodes might have different TYPE_MAIN_VARIANTs but still + represent the same type. For example, wchar_t and int could + have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE, + TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs + and are distinct types. On the other hand, int and the + following typedef + + typedef int INT __attribute((may_alias)); + + have identical properties, different TYPE_MAIN_VARIANTs, but + represent the same type. The canonical type system keeps + track of equivalence in this case, so we fall back on it. */ + return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2); + case POINTER_TYPE: - /* Do not remove mode or aliasing information. */ - if (TYPE_MODE (t1) != TYPE_MODE (t2) - || TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2)) + /* Do not remove mode information. */ + if (TYPE_MODE (t1) != TYPE_MODE (t2)) break; val = (TREE_TYPE (t1) == TREE_TYPE (t2) ? 1 : comptypes_internal (TREE_TYPE (t1), TREE_TYPE (t2), |