diff options
author | Andrew Pinski <pinskia@physics.uc.edu> | 2004-12-21 21:20:02 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2004-12-21 13:20:02 -0800 |
commit | af76441ffa6ffdfb4a4d3b10482e0d8d7e99181e (patch) | |
tree | 26a2279877aa52f21fba4ae120751143f5815a44 /gcc/pointer-set.c | |
parent | 697290b71d18569ef60fe446a689e74270457ab4 (diff) | |
download | gcc-af76441ffa6ffdfb4a4d3b10482e0d8d7e99181e.zip gcc-af76441ffa6ffdfb4a4d3b10482e0d8d7e99181e.tar.gz gcc-af76441ffa6ffdfb4a4d3b10482e0d8d7e99181e.tar.bz2 |
re PR c++/18984 (ICE in check_pointer_types_r)
2004-12-21 Andrew Pinski <pinskia@physics.uc.edu>
PR c++/18984
* pointer-set.c (pointer_set_contains): Add back.
* pointer-set.h (pointer_set_contains): Add back.
2004-12-21 Andrew Pinski <pinskia@physics.uc.edu>
PR c++/18984
* cp-gimplify.c (cp_genericize_r): Don't insert first but instead
check to see if contains the pointer. Insert the statement before
returning.
2004-12-21 Andrew Pinski <pinskia@physics.uc.edu>
PR C++/18984
* g++.dg/eh/ctor3.C: New test.
From-SVN: r92470
Diffstat (limited to 'gcc/pointer-set.c')
-rw-r--r-- | gcc/pointer-set.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/pointer-set.c b/gcc/pointer-set.c index 3f79cc2..266cccf 100644 --- a/gcc/pointer-set.c +++ b/gcc/pointer-set.c @@ -90,6 +90,29 @@ void pointer_set_destroy (struct pointer_set_t *pset) XDELETE (pset); } +/* Returns nonzero if PSET contains P. P must be nonnull. + + Collisions are resolved by linear probing. */ +int +pointer_set_contains (struct pointer_set_t *pset, void *p) +{ + size_t n = hash1 (p, pset->n_slots, pset->log_slots); + + while (true) + { + if (pset->slots[n] == p) + return 1; + else if (pset->slots[n] == 0) + return 0; + else + { + ++n; + if (n == pset->n_slots) + n = 0; + } + } +} + /* Subroutine of pointer_set_insert. Inserts P into an empty element of SLOTS, an array of length N_SLOTS. Returns nonzero if P was already present in N_SLOTS. */ |