PR c++/27601
authorreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Jun 2006 16:08:30 +0000 (16:08 +0000)
committerreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Jun 2006 16:08:30 +0000 (16:08 +0000)
* cp-tree.h (finish_offsetof): Add prototype.
* semantics.c (finish_offsetof): New function.
* parser.c (cp_parser_builtin_offsetof): Call it instead of
fold_offsetof.
* pt.c (tsubst_copy_and_build): Likewise.

* g++.dg/ext/offsetof1.C: Test member functions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114469 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/offsetof1.C

index c63ad83..d401f88 100644 (file)
@@ -1,3 +1,12 @@
+2006-06-07  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/27601
+       * cp-tree.h (finish_offsetof): Add prototype.
+       * semantics.c (finish_offsetof): New function.
+       * parser.c (cp_parser_builtin_offsetof): Call it instead of
+       fold_offsetof.
+       * pt.c (tsubst_copy_and_build): Likewise.
+
 2006-06-06  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/27177
index 4e83852..77b9067 100644 (file)
@@ -4252,6 +4252,7 @@ extern tree finish_id_expression          (tree, tree, tree,
                                                 bool, bool, bool, bool,
                                                 const char **);
 extern tree finish_typeof                      (tree);
+extern tree finish_offsetof                    (tree);
 extern void finish_decl_cleanup                        (tree, tree);
 extern void finish_eh_cleanup                  (tree);
 extern void expand_body                                (tree);
index ee80729..eaebe19 100644 (file)
@@ -6036,7 +6036,7 @@ cp_parser_builtin_offsetof (cp_parser *parser)
   if (processing_template_decl)
     expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
   else
-    expr = fold_offsetof (expr);
+    expr = finish_offsetof (expr);
 
  failure:
   parser->integral_constant_expression_p = save_ice_p;
index 8b2f0d3..07963d6 100644 (file)
@@ -9126,7 +9126,7 @@ tsubst_copy_and_build (tree t,
                                          in_decl));
 
     case OFFSETOF_EXPR:
-      return fold_offsetof (RECUR (TREE_OPERAND (t, 0)));
+      return finish_offsetof (RECUR (TREE_OPERAND (t, 0)));
 
     case STMT_EXPR:
       {
index b4e9505..8b41423 100644 (file)
@@ -2881,6 +2881,23 @@ finish_typeof (tree expr)
   return type;
 }
 
+/* Perform C++-specific checks for __builtin_offsetof before calling
+   fold_offsetof.  */
+
+tree
+finish_offsetof (tree expr)
+{
+  if (TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE
+      || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
+      || TREE_CODE (TREE_TYPE (expr)) == UNKNOWN_TYPE)
+    {
+      error ("cannot apply %<offsetof%> to member function %qD",
+            TREE_OPERAND (expr, 1));
+      return error_mark_node;
+    }
+  return fold_offsetof (expr);
+}
+
 /* Called from expand_body via walk_tree.  Replace all AGGR_INIT_EXPRs
    with equivalent CALL_EXPRs.  */
 
index 0e870df..3e03145 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-07  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/27601
+       * g++.dg/ext/offsetof1.C: Test member functions.
+
 2006-06-07  Steve Ellcey  <sje@cup.hp.com>
 
        * gcc.dg/pr27095.c: Improve scanning.
index 5d6552f..0cfabf8 100644 (file)
@@ -4,6 +4,9 @@
 
 struct bar {
   static int foo;
+  static int baz();
 };
 
 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" }