summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2019-06-01 17:27:20 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2019-06-01 11:27:20 -0600
commitf325e752268d3be618e4c044f831e07c6010fdb1 (patch)
tree947736b0c739662bc43f3866327b39f335d474ab /gcc
parente4b44fd741ee25aa5ad086949ccfbcbd3736c0f3 (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. From-SVN: r271838
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/dump-5.c15
-rw-r--r--gcc/tree-pretty-print.c12
4 files changed, 35 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 491577b8828..20bdc2bec37 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-01 Martin Sebor <msebor@redhat.com>
+
+ PR middle-end/90694
+ * tree-pretty-print.c (dump_generic_node): Add parentheses.
+
2019-05-31 Jan Hubicka <jh@suse.cz>
* alias.c: Include ipa-utils.h.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0663f4c07c6..0108097262b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-01 Martin Sebor <msebor@redhat.com>
+
+ PR middle-end/90694
+ * gcc.dg/tree-ssa/dump-5.c: New test.
+
2019-05-31 Jan Hubicka <jh@suse.cz>
* g++.dg/lto/alias-1_0.C: New testcase.
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 4ba9170ddd3..1d6eae101ee 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -1679,9 +1679,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,