diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-06-15 22:53:54 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-06-15 22:53:54 +0200 |
commit | 487f2f61bb1bad721f41a7f767efe04df4b0b058 (patch) | |
tree | 931ee4adff13dafe3bfa8dd9c958ae91481cc4c2 | |
parent | da8ea71e3733ba9c5f70a84cea9cafea6b0126b0 (diff) | |
download | gcc-487f2f61bb1bad721f41a7f767efe04df4b0b058.zip gcc-487f2f61bb1bad721f41a7f767efe04df4b0b058.tar.gz gcc-487f2f61bb1bad721f41a7f767efe04df4b0b058.tar.bz2 |
re PR c/86093 (volatile ignored on pointer in C)
PR c/86093
* c-typeck.c (pointer_diff): Cast both pointers to unqualified types
before doing POINTER_DIFF_EXPR.
* c-c++-common/pr86093.c: New test.
From-SVN: r261663
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr86093.c | 12 |
4 files changed, 27 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index fa9dca0..89e6d13 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2018-06-15 Jakub Jelinek <jakub@redhat.com> + + PR c/86093 + * c-typeck.c (pointer_diff): Cast both pointers to unqualified types + before doing POINTER_DIFF_EXPR. + 2018-06-07 Marek Polacek <polacek@redhat.com> PR c/85318 diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index f346eae..5e2a283 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -3840,7 +3840,12 @@ pointer_diff (location_t loc, tree op0, tree op1, tree *instrument_expr) op0 = build_binary_op (loc, MINUS_EXPR, convert (inttype, op0), convert (inttype, op1), false); else - op0 = build2_loc (loc, POINTER_DIFF_EXPR, inttype, op0, op1); + { + /* Cast away qualifiers. */ + op0 = convert (c_common_type (TREE_TYPE (op0), TREE_TYPE (op0)), op0); + op1 = convert (c_common_type (TREE_TYPE (op1), TREE_TYPE (op1)), op1); + op0 = build2_loc (loc, POINTER_DIFF_EXPR, inttype, op0, op1); + } /* This generates an error if op1 is pointer to incomplete type. */ if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (TREE_TYPE (orig_op1)))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 89b0567..03fc2a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2018-06-15 Jakub Jelinek <jakub@redhat.com> + PR c/86093 + * c-c++-common/pr86093.c: New test. + PR middle-end/85878 * gfortran.fortran-torture/compile/pr85878.f90: New test. diff --git a/gcc/testsuite/c-c++-common/pr86093.c b/gcc/testsuite/c-c++-common/pr86093.c new file mode 100644 index 0000000..06afbd6 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr86093.c @@ -0,0 +1,12 @@ +/* PR c/86093 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-final { scan-tree-dump-not "return 0;" "optimized" } } */ + +char *volatile p; + +__PTRDIFF_TYPE__ +foo (void) +{ + return p - p; +} |