From d23faea18e87ebd2fb4c24f996c62872d9d4b750 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 10 Dec 2002 22:31:40 +0000 Subject: [PATCH] re PR c++/8372 (ICE on explicit call of destructor) PR c++/8372 * pt.c (tsubst_copy): Handle destructor names more correctly. PR c++/8372 * g++.dg/template/dtor1.C: New test. From-SVN: r60015 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 7 ++++--- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/dtor1.C | 8 ++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/dtor1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9e56913ef1f..51860c5c527 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,4 +1,10 @@ +2002-12-10 Mark Mitchell + + PR c++/8372 + * pt.c (tsubst_copy): Handle destructor names more correctly. + 2002-12-10 Matt Austern + * cp-tree.h: get rid of needs_virtual_reinit bit. 2002-12-09 Mark Mitchell diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9f1a382bfa7..fa3caac01dc 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7233,9 +7233,10 @@ tsubst_copy (t, args, complain, in_decl) { tree base = tsubst_copy (TREE_OPERAND (name, 0), args, complain, in_decl); - name = TREE_OPERAND (name, 1); - name = tsubst_copy (TREE_OPERAND (name, 0), args, - complain, in_decl); + name = TREE_OPERAND (TREE_OPERAND (name, 1), 0); + if (TREE_CODE (name) == TYPE_DECL) + name = TREE_TYPE (name); + name = tsubst_copy (name, args, complain, in_decl); name = build1 (BIT_NOT_EXPR, NULL_TREE, name); name = build_nt (SCOPE_REF, base, name); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4b064472d42..f54e347f5f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2002-12-10 Mark Mitchell + PR c++/8372 + * g++.dg/template/dtor1.C: New test. + * g++.old-deja/g++.ext/memconst.C: Use old-deja, not dg, error markers. diff --git a/gcc/testsuite/g++.dg/template/dtor1.C b/gcc/testsuite/g++.dg/template/dtor1.C new file mode 100644 index 00000000000..f5d9d6aad18 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor1.C @@ -0,0 +1,8 @@ +struct A {}; + +template struct B +{ + B() { A().A::~A(); } +}; + +B b;