From: Volker Reichelt Date: Mon, 12 Jun 2006 23:03:36 +0000 (+0000) Subject: re PR c++/27601 (ICE (in fold_offsetof_1, at c-common.c:5998) on strange offsetof) X-Git-Tag: releases/gcc-4.0.4~618 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=76be82daad5b5d0c7cf190068414dc519da17ed7;p=thirdparty%2Fgcc.git 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: r114590 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9ad78f4e6c87..e31cec2f923b 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 e873e4425f96..e8c342ac31a4 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2790,6 +2790,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 e97f71dd586a..2c0dec4dd202 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2006-06-12 Volker Reichelt + PR c++/27601 + * g++.dg/ext/offsetof1.C: Add test for pseudo-destructors. + PR target/27421 * gcc.dg/union-3.c: New test. 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" }