From 6af6f77c5d5e80232a94a0232eac890276e18f19 Mon Sep 17 00:00:00 2001 From: jakub Date: Wed, 20 Jun 2018 20:40:33 +0000 Subject: Backported from mainline 2018-06-15 Jakub Jelinek 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 --- gcc/c/ChangeLog | 9 +++++++++ gcc/c/c-typeck.c | 7 ++++++- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/c-c++-common/pr86093.c | 12 ++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/pr86093.c 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 + + Backported from mainline + 2018-06-15 Jakub Jelinek + + PR c/86093 + * c-typeck.c (pointer_diff): Cast both pointers to unqualified types + before doing POINTER_DIFF_EXPR. + 2018-05-30 Jakub Jelinek 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 + + Backported from mainline + 2018-06-15 Jakub Jelinek + + PR c/86093 + * c-c++-common/pr86093.c: New test. + 2018-06-20 Nathan Sidwell 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; +} -- cgit v1.2.3