From: Mark Mitchell Date: Tue, 29 Oct 2002 23:51:12 +0000 (+0000) Subject: re PR c++/8287 (GCC3.2: Destructor called for non-constructed local object) X-Git-Tag: releases/gcc-3.2.1~85 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03e89750345bc60b427153d112eccc490279cff0;p=thirdparty%2Fgcc.git re PR c++/8287 (GCC3.2: Destructor called for non-constructed local object) PR c++/8287 * decl.c (finish_destructor_body): Create the label to jump to when returning from a destructor here. (finish_function_body): Rather than here. * g++.dg/init/dtor2.C: New test. From-SVN: r58642 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eaba75521948..dd372fbee1bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2002-10-29 Mark Mitchell + PR c++/8287 + * decl.c (finish_destructor_body): Create the label to jump to + when returning from a destructor here. + (finish_function_body): Rather than here. + * semantics.c (finish_alignof): Call complete_type before calling c_alignof. * decl2.c (build_expr_from_tree): Use diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 1b139ffdafb9..613766253f3b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -14112,6 +14112,10 @@ finish_destructor_body () { tree exprstmt; + /* Any return from a destructor will end up here; that way all base + and member cleanups will be run when the function returns. */ + add_stmt (build_stmt (LABEL_STMT, dtor_label)); + /* And perform cleanups for our bases and members. */ perform_base_cleanups (); @@ -14187,14 +14191,7 @@ void finish_function_body (compstmt) tree compstmt; { - if (processing_template_decl) - /* Do nothing now. */; - else if (DECL_DESTRUCTOR_P (current_function_decl)) - /* Any return from a destructor will end up here. Put it before the - cleanups so that an explicit return doesn't duplicate them. */ - add_stmt (build_stmt (LABEL_STMT, dtor_label)); - - /* Close the block; in a destructor, run the member cleanups. */ + /* Close the block. */ finish_compound_stmt (0, compstmt); if (processing_template_decl) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 592de43a9530..4b1531d85f70 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2002-10-29 Mark Mitchell + PR c++/8287 + * g++.dg/init/dtor2.C: New test. + * g++.dg/template/alignof1.C: New test. 2002-10-28 Kaveh R. Ghazi diff --git a/gcc/testsuite/g++.dg/init/dtor2.C b/gcc/testsuite/g++.dg/init/dtor2.C new file mode 100644 index 000000000000..56c7cac914dc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor2.C @@ -0,0 +1,28 @@ +// { dg-do run } + +extern "C" void abort (); + +struct A +{ + ~A(); +}; + +A::~A () { + abort (); +} + +struct B +{ + ~B(); +}; + +B::~B () { + if(true) return; + A a; +} + +int main() +{ + B b; + return 0; +}