From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/testsuite/g++.old-deja/g++.abi/vbase1.C | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 gcc/testsuite/g++.old-deja/g++.abi/vbase1.C (limited to 'gcc/testsuite/g++.old-deja/g++.abi/vbase1.C') diff --git a/gcc/testsuite/g++.old-deja/g++.abi/vbase1.C b/gcc/testsuite/g++.old-deja/g++.abi/vbase1.C new file mode 100644 index 000000000..680bec737 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.abi/vbase1.C @@ -0,0 +1,115 @@ +// { dg-do run } +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Jan 2001 + +// Bug 1611. Under the new ABI, the vtable can be clobbered during dtoring our +// primary vbase. We mustn't use the vtable after that to locate our vbases. + +#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 +#include +#include + +int *ctorVBase = 0; +int *dtorVBase = 0; +int *ctorVDerived = 0; +int *dtorVDerived = 0; +int *ctorB = 0; +int *dtorB = 0; + +struct VBase +{ + int member; + VBase () + { + if (ctorVBase) exit (1); + ctorVBase = &member; + } + virtual ~VBase () + { + if (dtorVBase) exit (2); + dtorVBase = &member; + if (dtorVBase != ctorVBase) exit (3); + } + void Offset () const + { + printf ("VBase\n"); + printf (" VBase::member %d\n", &this->VBase::member - (int *)this); + } +}; + +struct VDerived : virtual VBase +{ + int member; + + VDerived () + { + if (ctorVDerived) exit (4); + ctorVDerived = &member; + } + virtual ~VDerived () + { + if (dtorVDerived) exit (5); + dtorVDerived = &member; + if (dtorVDerived != ctorVDerived) exit (6); + } + void Offset () const + { + printf ("VDerived\n"); + printf (" VBase::member %d\n", &this->VBase::member - (int *)this); + printf (" VDerived::member %d\n", &this->VDerived::member - (int *)this); + } +}; +struct B : virtual VBase +{ + int member; + void Offset () const + { + printf ("B\n"); + printf (" VBase::member %d\n", &this->VBase::member - (int *)this); + printf (" B::member %d\n", &this->B::member - (int *)this); + } +}; +struct MostDerived : B, virtual VDerived +{ + int member; + void Offset () const + { + printf ("MostDerived\n"); + printf (" VBase::member %d\n", &this->VBase::member - (int *)this); + printf (" B::member %d\n", &this->B::member - (int *)this); + printf (" VDerived::member %d\n", &this->VDerived::member - (int *)this); + printf (" MostDerived::member %d\n", &this->MostDerived::member - (int *)this); + } +}; + + +int main () +{ + { + MostDerived dum; + + int *this_ = (int *)&dum; + + if (ctorVBase != &dum.VBase::member) + return 23; + if (ctorVDerived != &dum.VDerived::member) + return 24; + + printf (" VBase::member %d\n", &dum.VBase::member - this_); + printf (" B::member %d\n", &dum.B::member - this_); + printf (" VDerived::member %d\n", &dum.VDerived::member - this_); + printf (" MostDerived::member %d\n", &dum.MostDerived::member - this_); + dum.MostDerived::Offset (); + dum.B::Offset (); + dum.VDerived::Offset (); + dum.VBase::Offset (); + } + return 0; +} +#else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */ + +int main () +{ +} + +#endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */ -- cgit v1.2.3