From 4c65a5340dac8330c4ded126bc6a8a8b717399b3 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Mon, 12 Jun 2006 22:56:07 +0000 Subject: [PATCH] re PR c++/27601 (ICE (in fold_offsetof_1, at c-common.c:5998) on strange offsetof) PR c++/27601 * semantics.c (finish_offsetof): Handle pseudo-destructors. * g++.dg/ext/offsetof1.C: Add test for pseudo-destructors. From-SVN: r114588 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/semantics.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/offsetof1.C | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9bc98238566c..f64c233c4e7e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2006-06-12 Volker Reichelt + PR c++/27601 + * semantics.c (finish_offsetof): Handle pseudo-destructors. + PR c++/27933 * name-lookup.c (lookup_qualified_name): Always return error_mark_node if lookup fails. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8b4142316666..85881c0c3100 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2887,6 +2887,12 @@ finish_typeof (tree expr) tree finish_offsetof (tree expr) { + if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR) + { + error ("cannot apply % to destructor %<~%T%>", + TREE_OPERAND (expr, 2)); + return error_mark_node; + } if (TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE || TREE_CODE (TREE_TYPE (expr)) == UNKNOWN_TYPE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9274cbd3ea28..bb887b3cd89d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-06-12 Volker Reichelt + + PR c++/27601 + * g++.dg/ext/offsetof1.C: Add test for pseudo-destructors. + 2006-06-12 Mark Mitchell Kazu Hirata diff --git a/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc/testsuite/g++.dg/ext/offsetof1.C index 0cfabf8033c9..e59442de4edd 100644 --- a/gcc/testsuite/g++.dg/ext/offsetof1.C +++ b/gcc/testsuite/g++.dg/ext/offsetof1.C @@ -10,3 +10,9 @@ struct bar { int a = __builtin_offsetof(bar, foo); // { dg-error "static data member" } int b = __builtin_offsetof(bar, baz); // { dg-error "member function" } int c = __builtin_offsetof(bar, ~bar); // { dg-error "member function" } + +typedef int I; +enum E { }; + +int d = __builtin_offsetof(I, ~I); // { dg-error "destructor" } +int e = __builtin_offsetof(E, ~E); // { dg-error "destructor" }