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>
PR middle-end/36137
......
......@@ -391,6 +391,13 @@ find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
{
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 (*pdecl)
......@@ -406,8 +413,9 @@ find_single_pointer_decl_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
return NULL_TREE;
}
/* Find the single DECL of pointer type in the tree T and return it.
If there are zero or more than one such DECLs, return NULL. */
/* Find the single DECL of pointer type in the tree T, used directly
rather than via an indirection, and return it. If there are zero
or more than one such DECLs, return NULL. */
static tree
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
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;
}
......
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
* 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