From 2acb1af9aae1057e9a3af38b4c6f4f40f0f79205 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 14 Oct 2005 08:38:59 +0000 Subject: [PATCH] re PR c++/23984 (second operand of PLUS_EXPR is NULL (in constructor)) cp: PR c++/23984 * class.c (build_base_path): The vtable is always the first thing in the vtt. testsuite: PR c++/23984 * g++.dg/init/ctor7.C: New. From-SVN: r105396 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/class.c | 10 +++----- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/init/ctor7.C | 51 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/ctor7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec81292..75ca019 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-10-13 Nathan Sidwell + + PR c++/23984 + * class.c (build_base_path): The vtable is always the first thing + in the vtt. + 2005-10-13 Mark Mitchell PR c++/20721 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index dceeffe..dc52975 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -325,16 +325,14 @@ build_base_path (enum tree_code code, if (fixed_type_p < 0 && in_base_initializer) { - /* In a base member initializer, we cannot rely on - the vtable being set up. We have to use the vtt_parm. */ - tree derived = BINFO_INHERITANCE_CHAIN (v_binfo); + /* In a base member initializer, we cannot rely on the + vtable being set up. We have to indirect via the + vtt_parm. */ tree t; - t = TREE_TYPE (TYPE_VFIELD (BINFO_TYPE (derived))); + t = TREE_TYPE (TYPE_VFIELD (current_class_type)); t = build_pointer_type (t); v_offset = convert (t, current_vtt_parm); - v_offset = build2 (PLUS_EXPR, t, v_offset, - BINFO_VPTR_INDEX (derived)); v_offset = build_indirect_ref (v_offset, NULL); } else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 11807d3..a119dca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-10-14 Nathan Sidwell + + PR c++/23984 + * g++.dg/init/ctor7.C: New. + 2005-10-13 David Edelsohn PR c++/23730 diff --git a/gcc/testsuite/g++.dg/init/ctor7.C b/gcc/testsuite/g++.dg/init/ctor7.C new file mode 100644 index 0000000..3378a15 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor7.C @@ -0,0 +1,51 @@ +// { dg-do run } + +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Oct 2005 + +// PR 23984:ICE +// Origin: Andrew Pinski pinskia@gcc.gnu.org + +struct B +{ + virtual void Foo (); +}; + +void B::Foo () +{ +} + +struct D : virtual B +{ +}; + +struct E +{ + B *ptr; + + E (B *); +}; + +static B *ptr; + +E::E (B *ptr_) + :ptr (ptr_) +{ +} + +struct G : D, E +{ + G (); +}; + +G::G () + : E (this) +{ +} + +int main () +{ + G object; + + return object.ptr != &object; +} -- 2.7.4