Commit 2ee510b4 by Ian Lance Taylor Committed by Jakub Jelinek

re PR middle-end/36013 (Wrong code involving restricted pointers to non-restricted pointers)

	PR middle-end/36013
	* gimplify.c (find_single_pointer_decl_1): Don't look through
	indirections.
	(find_single_pointer_decl): Adjust comments.

	* gcc.c-torture/execute/20080506-2.c: New test.

From-SVN: r135029
parent f61edbf6
2008-05-07 Ian Lance Taylor <iant@google.com>
PR middle-end/36013
* gimplify.c (find_single_pointer_decl_1): Don't look through
indirections.
(find_single_pointer_decl): Adjust comments.
2008-05-07 Jakub Jelinek <jakub@redhat.com> 2008-05-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36137 PR middle-end/36137
......
...@@ -391,6 +391,13 @@ find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, ...@@ -391,6 +391,13 @@ find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
{ {
tree *pdecl = (tree *) data; tree *pdecl = (tree *) data;
/* We are only looking for pointers at the same level as the
original tree; we must not look through any indirections.
Returning anything other than NULL_TREE will cause the caller to
not find a base. */
if (REFERENCE_CLASS_P (*tp))
return *tp;
if (DECL_P (*tp) && POINTER_TYPE_P (TREE_TYPE (*tp))) if (DECL_P (*tp) && POINTER_TYPE_P (TREE_TYPE (*tp)))
{ {
if (*pdecl) if (*pdecl)
...@@ -406,8 +413,9 @@ find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, ...@@ -406,8 +413,9 @@ find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
return NULL_TREE; return NULL_TREE;
} }
/* Find the single DECL of pointer type in the tree T and return it. /* Find the single DECL of pointer type in the tree T, used directly
If there are zero or more than one such DECLs, return NULL. */ rather than via an indirection, and return it. If there are zero
or more than one such DECLs, return NULL. */
static tree static tree
find_single_pointer_decl (tree t) find_single_pointer_decl (tree t)
...@@ -418,7 +426,8 @@ find_single_pointer_decl (tree t) ...@@ -418,7 +426,8 @@ find_single_pointer_decl (tree t)
{ {
/* find_single_pointer_decl_1 returns a nonzero value, causing /* find_single_pointer_decl_1 returns a nonzero value, causing
walk_tree to return a nonzero value, to indicate that it walk_tree to return a nonzero value, to indicate that it
found more than one pointer DECL. */ found more than one pointer DECL or that it found an
indirection. */
return NULL_TREE; return NULL_TREE;
} }
......
2008-05-07 Jakub Jelinek <jakub@redhat.com> 2008-05-07 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36013
* gcc.c-torture/execute/20080506-2.c: New test.
PR middle-end/36137 PR middle-end/36137
* gcc.c-torture/execute/20080506-1.c: New test. * gcc.c-torture/execute/20080506-1.c: New test.
/* PR middle-end/36013 */
extern void abort (void);
void __attribute__((noinline))
foo (int **__restrict p, int **__restrict q)
{
*p[0] = 1;
*q[0] = 2;
if (*p[0] != 2)
abort ();
}
int
main (void)
{
int a;
int *p1 = &a, *p2 = &a;
foo (&p1, &p2);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment