aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2018-06-20 20:40:33 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2018-06-20 20:40:33 +0000
commit6af6f77c5d5e80232a94a0232eac890276e18f19 (patch)
treeb3b27010293d3b443b6ee568817cfcadf7897cb9
parent4968b68839a816af16b49030b74e54703a3cdd4d (diff)
Backported from mainline
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. * c-c++-common/pr86093.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-8-branch@261820 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/c/ChangeLog9
-rw-r--r--gcc/c/c-typeck.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/c-c++-common/pr86093.c12
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 077d348bc69..b80178de881 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,12 @@
+2018-06-20 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 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-05-30 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 4c88ff59c90..3439f6e5ff7 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 b7a8024d996..4e504b13fd9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2018-06-20 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2018-06-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/86093
+ * c-c++-common/pr86093.c: New test.
+
2018-06-20 Nathan Sidwell <nathan@acm.org>
PR c++/85634 - tsubst ICE on unmarked lookup
diff --git a/gcc/testsuite/c-c++-common/pr86093.c b/gcc/testsuite/c-c++-common/pr86093.c
new file mode 100644
index 00000000000..06afbd60dba
--- /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;
+}