diff mbox series

correct the representation of ADDR_EXPR involving pointer to array [PR 90694]

Message ID 46673e65-eefd-68d5-088b-1a9723a84a9c@gmail.com
State New
Headers show
Series correct the representation of ADDR_EXPR involving pointer to array [PR 90694] | expand

Commit Message

Martin Sebor May 31, 2019, 7:56 p.m. UTC
Given a poiner to array p, tree dumps for expressions like &(*p)[2]
actually show &*p[2].  That's not right -- the parentheses are
important to differentiate indexing into the array the pointer
points to from indexing into the pointer.

The attached patch adjusts the tree pretty printer to add the parens
when the pointer points to an array.

Tested on x86_64-linux.

Martin

Comments

Jeff Law May 31, 2019, 8:50 p.m. UTC | #1
On 5/31/19 1:56 PM, Martin Sebor wrote:
> Given a poiner to array p, tree dumps for expressions like &(*p)[2]
> actually show &*p[2].  That's not right -- the parentheses are
> important to differentiate indexing into the array the pointer
> points to from indexing into the pointer.
> 
> The attached patch adjusts the tree pretty printer to add the parens
> when the pointer points to an array.
> 
> Tested on x86_64-linux.
> 
> Martin
> 
> gcc-90694.diff
> 
> PR middle-end/90694 - incorrect representation of ADDR_EXPR involving a pointer to array
> 
> gcc/ChangeLog:
> 
> 	PR middle-end/90694
> 	* tree-pretty-print.c (dump_generic_node): Add parentheses.
> 
> gcc/testsuite/ChangeLog:
> 
> 	PR middle-end/90694
> 	* gcc.dg/tree-ssa/dump-5.c: New test.
OK.  I'm going to assume that the gimple parser already does the right
thing since it's supposed to already handle C expressions correctly.

Jeff
Richard Biener June 3, 2019, 9:42 a.m. UTC | #2
On Fri, May 31, 2019 at 10:50 PM Jeff Law <law@redhat.com> wrote:
>
> On 5/31/19 1:56 PM, Martin Sebor wrote:
> > Given a poiner to array p, tree dumps for expressions like &(*p)[2]
> > actually show &*p[2].  That's not right -- the parentheses are
> > important to differentiate indexing into the array the pointer
> > points to from indexing into the pointer.
> >
> > The attached patch adjusts the tree pretty printer to add the parens
> > when the pointer points to an array.
> >
> > Tested on x86_64-linux.
> >
> > Martin
> >
> > gcc-90694.diff
> >
> > PR middle-end/90694 - incorrect representation of ADDR_EXPR involving a pointer to array
> >
> > gcc/ChangeLog:
> >
> >       PR middle-end/90694
> >       * tree-pretty-print.c (dump_generic_node): Add parentheses.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       PR middle-end/90694
> >       * gcc.dg/tree-ssa/dump-5.c: New test.
> OK.  I'm going to assume that the gimple parser already does the right
> thing since it's supposed to already handle C expressions correctly.

-gimple dumping doesn't elide dumping MEM_REFs to plain * so you
see

  _1 = &__MEM <char[8]> (pa)[2];
  _2 = __builtin_strlen (_1);

I think the GIMPLE FE accepts *p as dereference in source, sth I
should eventually fix (it likewise accepts ->).  It then just does
what the C frontend does since it shares most of its parsing.

Richard.

> Jeff
diff mbox series

Patch

PR middle-end/90694 - incorrect representation of ADDR_EXPR involving a pointer to array

gcc/ChangeLog:

	PR middle-end/90694
	* tree-pretty-print.c (dump_generic_node): Add parentheses.

gcc/testsuite/ChangeLog:

	PR middle-end/90694
	* gcc.dg/tree-ssa/dump-5.c: New test.

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dump-5.c b/gcc/testsuite/gcc.dg/tree-ssa/dump-5.c
new file mode 100644
index 00000000000..6807b5e9ef4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/dump-5.c
@@ -0,0 +1,15 @@ 
+/* PR middle-end/90694 - incorrect representation of ADDR_EXPR involving
+   a pointer to array
+   { dg-do compile }
+   { dg-options "-fdump-tree-original" } */
+
+typedef char A8[8];
+
+unsigned f (A8 *pa)
+{
+  return __builtin_strlen (&(*pa)[2]);
+}
+
+/* Veriy the expression is correct in the dump:
+  { dg-final { scan-tree-dump-not "\\\&\\\*pa\\\[2\\\]" "original" } }
+  { dg-final { scan-tree-dump "\\\&\\\(\\\*pa\\\)\\\[2\\\]" "original" } } */
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 6645a646617..30d1d65e6bc 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -1676,9 +1676,17 @@  dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
 	  {
 	    if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
 	      {
+		/* Enclose pointers to arrays in parentheses.  */
+		tree op0 = TREE_OPERAND (node, 0);
+		tree op0type = TREE_TYPE (op0);
+		if (POINTER_TYPE_P (op0type)
+		    && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
+		  pp_left_paren (pp);
 		pp_star (pp);
-		dump_generic_node (pp, TREE_OPERAND (node, 0),
-				   spc, flags, false);
+		dump_generic_node (pp, op0, spc, flags, false);
+		if (POINTER_TYPE_P (op0type)
+		    && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
+		  pp_right_paren (pp);
 	      }
 	    else
 	      dump_generic_node (pp,