aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>2006-06-12 22:56:07 +0000
committerVolker Reichelt <reichelt@gcc.gnu.org>2006-06-12 22:56:07 +0000
commit4c65a5340dac8330c4ded126bc6a8a8b717399b3 (patch)
tree1712a3d650ee1cb20144d6c58a7740745f149774
parentdfa9dde4e03150d4df95bbcfc8121b52cac401c6 (diff)
downloadgcc-4c65a5340dac8330c4ded126bc6a8a8b717399b3.zip
gcc-4c65a5340dac8330c4ded126bc6a8a8b717399b3.tar.gz
gcc-4c65a5340dac8330c4ded126bc6a8a8b717399b3.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/offsetof1.C6
4 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9bc9823..f64c233c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2006-06-12 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+ 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 8b41423..85881c0 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 %<offsetof%> 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 9274cbd..bb887b3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-06-12 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/27601
+ * g++.dg/ext/offsetof1.C: Add test for pseudo-destructors.
+
2006-06-12 Mark Mitchell <mark@codesourcery.com>
Kazu Hirata <kazu@codesourcery.com>
diff --git a/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc/testsuite/g++.dg/ext/offsetof1.C
index 0cfabf8..e59442d 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" }