diff options
author | Ian Lance Taylor <iant@google.com> | 2008-05-07 09:45:17 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-05-07 09:45:17 +0200 |
commit | 2ee510b4220fe07af99aae860afa178898b12cf7 (patch) | |
tree | 64710767b3276cd480a6e30e9f003c1c16e08ead /gcc/gimplify.c | |
parent | f61edbf65f93da4d4c1d7c3f201b39dc85d982c2 (diff) | |
download | gcc-2ee510b4220fe07af99aae860afa178898b12cf7.zip gcc-2ee510b4220fe07af99aae860afa178898b12cf7.tar.gz gcc-2ee510b4220fe07af99aae860afa178898b12cf7.tar.bz2 |
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
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 2e8ffef..e36d5db 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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; } |