From 5633b37c1bba472243075b894adb9a83053f4d35 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 30 Oct 2002 00:05:36 +0000 Subject: [PATCH] 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. PR c++/8287 * g++.dg/init/dtor2.C: New test. From-SVN: r58643 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl.c | 13 +++++-------- gcc/testsuite/g++.dg/init/dtor2.C | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/dtor2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9e212a8d56..dba4a0d0237 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +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. + 2002-10-25 Zack Weinberg PR c++/7266 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index e3b7b5b773a..f42c8d3fdab 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -14275,6 +14275,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)); + /* In a virtual destructor, we must call delete. */ if (DECL_VIRTUAL_P (current_function_decl)) { @@ -14347,14 +14351,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/g++.dg/init/dtor2.C b/gcc/testsuite/g++.dg/init/dtor2.C new file mode 100644 index 00000000000..56c7cac914d --- /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; +}