]> 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>
Wed, 7 Jun 2006 16:18:06 +0000 (16:18 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Wed, 7 Jun 2006 16:18:06 +0000 (16:18 +0000)
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.

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

From-SVN: r114471

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 2adc989797602bbb2184d4bb75873dcf3587d38f..9b2715c199aafe7136dbd70357f2b8583c6002f5 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-05-29  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/27713
index e867d913f78863f092cffbfdf16469340c75fd29..47db45f797e5fc9a6f91ed7c41e98bac22a0d40f 100644 (file)
@@ -4215,6 +4215,7 @@ extern tree finish_id_expression                (tree, tree, tree,
                                                 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 7035645c3594a7e3edff587bf5e47062b1e24a86..7eb05e8316c1a9edffa8dd40b45e6d452706528f 100644 (file)
@@ -5911,7 +5911,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 e4b2d70add85567a5dcd84405a658dbf0e23470e..18c345383cec1b817f1a43794e5d72b7f3f8a1a1 100644 (file)
@@ -8941,7 +8941,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 6006621c97a5ed6c62137eae372f204822a1098c..e873e4425f9693ff0db69c30462ad862a2faec4c 100644 (file)
@@ -2784,6 +2784,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 b65d909a810ac23357d1d8cad4d73a79bd2ba83a..55f39720f4245c272b8885b636a138c832d5a919 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-06  Roger Sayle  <roger@eyesopen.com>
 
        PR target/26223
index 5d6552f78787215971f7fc9a975e689786a5395d..0cfabf8033c9b2cfdc9ef3de449bd22952f9e485 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" }