]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/38880 (g++.dg/init/const7.C XFAILed)
authorJason Merrill <jason@redhat.com>
Mon, 23 Feb 2009 21:23:58 +0000 (16:23 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 23 Feb 2009 21:23:58 +0000 (16:23 -0500)
        PR c++/38880
        * varasm.c (initializer_constant_valid_p) [PLUS_EXPR]: Check
        narrowing_initializer_constant_valid_p.
        (narrowing_initializer_constant_valid_p): Don't return
        null_pointer_node for adding a pointer to itself.

From-SVN: r144395

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/const7.C
gcc/testsuite/g++.dg/init/static-init1.C [new file with mode: 0644]
gcc/varasm.c

index e63df9dad8972b63e8fc8a2cd0fb6bb18941896f..58f0f9138540af83b63dd7228bc827a1db486e3d 100644 (file)
@@ -1,3 +1,11 @@
+2009-02-23  Jason Merrill  <jason@redhat.com>
+
+       PR c++/38880
+       * varasm.c (initializer_constant_valid_p) [PLUS_EXPR]: Check
+       narrowing_initializer_constant_valid_p.
+       (narrowing_initializer_constant_valid_p): Don't return 
+       null_pointer_node for adding a pointer to itself.
+
 2009-02-23  Jan Hubicka  <jh@suse.cz>
 
        PR c/12245
index 3ca4282565530e97a4c4f0c50283ca39a3e62e31..9c6b43aec27ad321410890c4a024b851018ea331 100644 (file)
@@ -1,5 +1,9 @@
 2009-02-23  Jason Merrill  <jason@redhat.com>
 
+       PR c++/38880
+       * g++.dg/init/const7.C: Remove XFAIL.
+       * g++.dg/init/static-init1.C: New test.
+
        * g++.dg/cpp0x/initlist14.C: New test.
 
 2008-02-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
index 348bd58d6905d44e2adf3952974191ff39c044b4..18d04625db2da1178c806ee1f0a5cf287e65b66a 100644 (file)
@@ -9,5 +9,5 @@ short offsets[1] = {
 // This ensures that we get a dump whether or not the bug is present.
 void fn() { }
 
-// { dg-final { scan-tree-dump-not "initialization"  "gimple" { xfail *-*-* } } }
+// { dg-final { scan-tree-dump-not "initialization"  "gimple" } }
 // { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc/testsuite/g++.dg/init/static-init1.C b/gcc/testsuite/g++.dg/init/static-init1.C
new file mode 100644 (file)
index 0000000..dddbca1
--- /dev/null
@@ -0,0 +1,5 @@
+// Related to the patch for 38880.
+// Make sure we don't think we can initialize a at compile time.
+
+char c;
+short a[] = { (short)((int)&c + (int)&c) };
index 0589fc93e49b7e33b322c419a5a3d6f08af6ac2b..c724fcd721ec35edd6b2b01eda4a98ad16366bc9 100644 (file)
@@ -4070,8 +4070,8 @@ constructor_static_from_elts_p (const_tree ctor)
          && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor)));
 }
 
-/* A subroutine of initializer_constant_valid_p.  VALUE is either a
-   MINUS_EXPR or a POINTER_PLUS_EXPR.  This looks for cases of VALUE
+/* A subroutine of initializer_constant_valid_p.  VALUE is a MINUS_EXPR,
+   PLUS_EXPR or POINTER_PLUS_EXPR.  This looks for cases of VALUE
    which are valid when ENDTYPE is an integer of any size; in
    particular, this does not accept a pointer minus a constant.  This
    returns null_pointer_node if the VALUE is an absolute constant
@@ -4124,7 +4124,9 @@ narrowing_initializer_constant_valid_p (tree value, tree endtype)
   /* Both initializers must be known.  */
   if (op0 && op1)
     {
-      if (op0 == op1)
+      if (op0 == op1
+         && (op0 == null_pointer_node
+             || TREE_CODE (value) == MINUS_EXPR))
        return null_pointer_node;
 
       /* Support differences between labels.  */
@@ -4315,12 +4317,10 @@ initializer_constant_valid_p (tree value, tree endtype)
        }
 
       /* Support narrowing pointer differences.  */
-      if (TREE_CODE (value) == POINTER_PLUS_EXPR)
-       {
-         ret = narrowing_initializer_constant_valid_p (value, endtype);
-         if (ret != NULL_TREE)
-           return ret;
-       }
+      ret = narrowing_initializer_constant_valid_p (value, endtype);
+      if (ret != NULL_TREE)
+       return ret;
+
       break;
 
     case MINUS_EXPR: