diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2001-01-19 13:32:53 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2001-01-19 13:32:53 +0000 |
commit | 1e00f18c429f2d54fae23259eb37b81caec583f2 (patch) | |
tree | 0de72355fb4870279d858fdaf3fbe3ce57a06721 /gcc | |
parent | 9f1b75fccdadafcb442b16897084ea062c14cc3d (diff) | |
download | gcc-1e00f18c429f2d54fae23259eb37b81caec583f2.zip gcc-1e00f18c429f2d54fae23259eb37b81caec583f2.tar.gz gcc-1e00f18c429f2d54fae23259eb37b81caec583f2.tar.bz2 |
search.c (get_vbase_1): Count only virtual bases.
cp:
* search.c (get_vbase_1): Count only virtual bases.
testsuite:
* g++.old-deja/g++.other/vbase5.C: New test.
From-SVN: r39132
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/search.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/vbase5.C | 202 |
4 files changed, 214 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b81617e..b12874f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2001-01-19 Nathan Sidwell <nathan@codesourcery.com> + * search.c (get_vbase_1): Count only virtual bases. + +2001-01-19 Nathan Sidwell <nathan@codesourcery.com> + * class.c (duplicate_tag_error): Robustify flag clearing. 2001-01-19 Nathan Sidwell <nathan@codesourcery.com> diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 5beedb0..0bb309f 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -193,15 +193,15 @@ get_vbase_1 (parent, binfo, depth) tree binfos; int i, n_baselinks; tree rval = NULL_TREE; + int virtualp = TREE_VIA_VIRTUAL (binfo) != 0; - if (BINFO_TYPE (binfo) == parent && TREE_VIA_VIRTUAL (binfo)) + *depth -= virtualp; + if (virtualp && BINFO_TYPE (binfo) == parent) { *depth = 0; return binfo; } - *depth = *depth - 1; - binfos = BINFO_BASETYPES (binfo); n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; @@ -218,7 +218,7 @@ get_vbase_1 (parent, binfo, depth) if (nrval) rval = nrval; } - *depth = *depth+1; + *depth += virtualp; return rval; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index efeee5d..b8b57af 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-01-19 Nathan Sidwell <nathan@codesourcery.com> + + * g++.old-deja/g++.other/vbase5.C: New test. + 2001-01-19 Jakub Jelinek <jakub@redhat.com> * gcc.c-torture/execute/20010118-1.c: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.other/vbase5.C b/gcc/testsuite/g++.old-deja/g++.other/vbase5.C new file mode 100644 index 0000000..03b846f --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/vbase5.C @@ -0,0 +1,202 @@ +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 19 Jan 2001 <nathan@codesourcery.com> + +// Bug 1701. building a vbase path was not using the shortest number of +// vbases. Normally that's just a pessimization, unfortunately during +// constructoring it leads to uninitialized reads. + +extern "C" int printf (...); + +int fail = 0; + +/*{{{ struct Base*/ +struct Base +{ + unsigned m; + static Base *addr; + + Base (); + virtual ~Base (); +}; +/*}}}*/ +Base *Base::addr; +/*{{{ Base::Base ()*/ +Base::Base () +{ + printf ("Base (%u) ctor %x\n", sizeof (Base), this); + if (fail) ; + else if (addr) + fail = 1; + else + addr = this; +} +/*}}}*/ +/*{{{ Base::~Base ()*/ +Base::~Base () +{ + printf ("Base dtor %x\n", this); + if (fail) + ; + else if (this != addr) + fail = 2; + else + addr = 0; +} +/*}}}*/ + +/*{{{ struct M10 : virtual Base*/ +struct M10 : virtual Base +{ + int m; + static M10 *addr; + + M10 (); + virtual ~M10 (); +}; +/*}}}*/ +M10 *M10::addr; +/*{{{ M10::M10 ()*/ +M10::M10 () +{ + printf ("M10 (%u) ctor %x\n", sizeof (M10), this); + if (fail) ; + else if (addr) + fail = 3; + else + addr = this; +} +/*}}}*/ +/*{{{ M10::~M10 ()*/ +M10::~M10 () +{ + printf ("M10 dtor %x\n", this); + if (fail) + ; + else if (this != addr) + fail = 4; + else + addr = 0; +} +/*}}}*/ + +/*{{{ struct M4 : virtual Base, virtual M10*/ +struct M4 : virtual Base, virtual M10 +{ + int m; + static M4 *addr; + + M4 (); + virtual ~M4 (); +}; +/*}}}*/ +M4 *M4::addr; +/*{{{ M4::M4 ()*/ +M4::M4 () +{ + printf ("M4 (%u) ctor %x\n", sizeof (M4), this); + if (fail) ; + else if (addr) + fail = 5; + else + addr = this; +} +/*}}}*/ +/*{{{ M4::~M4 ()*/ +M4::~M4 () +{ + printf ("M4 dtor %x\n", this); + if (fail) + ; + else if (this != addr) + fail = 6; + else + addr = 0; +} +/*}}}*/ + +/*{{{ struct M5 : M4*/ +struct M5 : M4 +{ + int m; + static M5 *addr; + + M5 (); + virtual ~M5 (); +}; +/*}}}*/ +M5 *M5::addr; +/*{{{ M5::M5 ()*/ +M5::M5 () +{ + printf ("M5 (%u) ctor %x\n", sizeof (M5), this); + if (fail) ; + else if (addr) + fail = 7; + else + addr = this; +} +/*}}}*/ +/*{{{ M5::~M5 ()*/ +M5::~M5 () +{ + printf ("M5 dtor %x\n", this); + if (fail) + ; + else if (this != addr) + fail = 8; + else + addr = 0; +} +/*}}}*/ + +/*{{{ struct M9 : M5, virtual M10*/ +struct M9 : M5, virtual M10 +{ + int m; + static M9 *addr; + + M9 (); + virtual ~M9 (); +}; +/*}}}*/ +M9 *M9::addr; +/*{{{ M9::M9 ()*/ +M9::M9 () +{ + printf ("M9 (%u), ctor %x\n", sizeof (M9), this); + if (fail) ; + else if (addr) + fail = 9; + else + addr = this; +} +/*}}}*/ +/*{{{ M9::~M9 ()*/ +M9::~M9 () +{ + printf ("M9 dtor %x\n", this); + if (fail) + ; + else if (this != addr) + fail = 10; + else + addr = 0; +} +/*}}}*/ + +int main () +{ + M9 *m9; + Base *r; + + m9 = new M9 (); + r = m9; + if (fail) + return fail; + void *top = dynamic_cast <void *> (r); + if (top != m9) + return 20; + r->~Base (); + + return fail; +} |