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
This commit is contained in:
parent
f61edbf65f
commit
2ee510b422
@ -1,3 +1,10 @@
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,8 @@
|
||||
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.
|
||||
|
||||
|
21
gcc/testsuite/gcc.c-torture/execute/20080506-2.c
Normal file
21
gcc/testsuite/gcc.c-torture/execute/20080506-2.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user