re PR c++/27601 (ICE (in fold_offsetof_1, at c-common.c:5998) on strange offsetof)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Mon, 12 Jun 2006 22:56:07 +0000 (22:56 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Mon, 12 Jun 2006 22:56:07 +0000 (22:56 +0000)
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
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/offsetof1.C

index 9bc98238566c37d0fa0757aa9a38836e9a04e33e..f64c233c4e7e6ec7f53ba2e19148a3812ca1519c 100644 (file)
@@ -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.
index 8b4142316666c42b1c6d9a3aef2e9dd632f83656..85881c0c3100f157bf6b253b1b8f01d2d21c5046 100644 (file)
@@ -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)
index 9274cbd3ea28d7b242fe12960c7ea02b36015416..bb887b3cd89ddc677bbb376c144499b4ae3bd91f 100644 (file)
@@ -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>
 
index 0cfabf8033c9b2cfdc9ef3de449bd22952f9e485..e59442de4edd6a738f9e005bc39ec3bffa1ace50 100644 (file)
@@ -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" }