OSDN Git Service

PR middle-end/44100
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 May 2010 22:03:09 +0000 (22:03 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 May 2010 22:03:09 +0000 (22:03 +0000)
* typeck.c (cp_build_unary_op): Fold offsetof-like computations.

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

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/array-size2.C

index 74cb213..cd86b88 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-24  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/44100
+       * typeck.c (cp_build_unary_op): Fold offsetof-like computations.
+
 2010-05-24  Joseph Myers  <joseph@codesourcery.com>
 
        * error.c (cp_diagnostic_starter): Update call to
index 54ccbfe..77cf8fd 100644 (file)
@@ -5024,6 +5024,20 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
          return arg;
        }
 
+      /* ??? Cope with user tricks that amount to offsetof.  */
+      if (TREE_CODE (argtype) != FUNCTION_TYPE
+         && TREE_CODE (argtype) != METHOD_TYPE
+         && argtype != unknown_type_node
+         && (val = get_base_address (arg))
+         && TREE_CODE (val) == INDIRECT_REF
+         && TREE_CONSTANT (TREE_OPERAND (val, 0)))
+       {
+         tree type = build_pointer_type (argtype);
+         tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
+         tree op1 = fold_convert (sizetype, fold_offsetof (arg, val));
+         return fold_build2 (POINTER_PLUS_EXPR, type, op0, op1);
+       }
+
       /* Uninstantiated types are all functions.  Taking the
         address of a function is a no-op, so just return the
         argument.  */
index 8fd1fd5..ddb08ad 100644 (file)
@@ -1,5 +1,9 @@
 2010-05-24  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * g++.dg/parse/array-size2.C: Remove dg-error directives.
+
+2010-05-24  Eric Botcazou  <ebotcazou@adacore.com>
+
        PR ada/38394
        * gnat.dg/array13.ad[sb]: New test.
 
index 22a57b2..355ed61 100644 (file)
@@ -1,6 +1,7 @@
 // PR c/25682
 // { dg-do compile }
-// Test whether we don't ICE on invalid array sizes.
+// Test whether we don't ICE on questionable constructs where offsetof
+// should have been used instead.
 
 struct S
 {
@@ -13,7 +14,7 @@ extern void bar (char *, char *);
 void
 foo (void)
 {
-  char g[(char *) &((struct S *) 0)->b - (char *) 0];  // { dg-error "not an integral constant-expression" }
-  char h[(__SIZE_TYPE__) &((struct S *) 8)->b];                // { dg-error "not an integral constant-expression" }
+  char g[(char *) &((struct S *) 0)->b - (char *) 0];
+  char h[(__SIZE_TYPE__) &((struct S *) 8)->b];
   bar (g, h);
 }