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.
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)
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.
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" }