]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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 23:03:36 +0000 (23:03 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Mon, 12 Jun 2006 23:03:36 +0000 (23:03 +0000)
PR c++/27601
* semantics.c (finish_offsetof): Handle pseudo-destructors.

* g++.dg/ext/offsetof1.C: Add test for pseudo-destructors.

From-SVN: r114590

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/offsetof1.C

index 9ad78f4e6c87623590fad32856c76e979a457e4a..e31cec2f923b840100293299ee7098b9b042b097 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 e873e4425f9693ff0db69c30462ad862a2faec4c..e8c342ac31a46be5cbedacb7c24fed2a796fb9f1 100644 (file)
@@ -2790,6 +2790,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 e97f71dd586aaec9c39d9d426f85ea801420f17f..2c0dec4dd20203a72e02806483c69736aa21e1fa 100644 (file)
@@ -1,5 +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.
+
        PR target/27421
        * gcc.dg/union-3.c: New test.
 
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" }