aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-02-23 16:23:58 -0500
committerJason Merrill <jason@gcc.gnu.org>2009-02-23 16:23:58 -0500
commitd8028f2cc34c6fe1f5a8b93762195dcdbbd37b71 (patch)
tree2f9fbf6ee094e40be52158fbd7313e4dbd65c998
parent68c512f66db07a1bbe7f1fb9c42eedeba65e13c2 (diff)
downloadgcc-d8028f2cc34c6fe1f5a8b93762195dcdbbd37b71.zip
gcc-d8028f2cc34c6fe1f5a8b93762195dcdbbd37b71.tar.gz
gcc-d8028f2cc34c6fe1f5a8b93762195dcdbbd37b71.tar.bz2
re PR c++/38880 (g++.dg/init/const7.C XFAILed)
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/init/const7.C2
-rw-r--r--gcc/testsuite/g++.dg/init/static-init1.C5
-rw-r--r--gcc/varasm.c18
5 files changed, 27 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e63df9d..58f0f91 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3ca4282..9c6b43a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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>
diff --git a/gcc/testsuite/g++.dg/init/const7.C b/gcc/testsuite/g++.dg/init/const7.C
index 348bd58..18d0462 100644
--- a/gcc/testsuite/g++.dg/init/const7.C
+++ b/gcc/testsuite/g++.dg/init/const7.C
@@ -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
index 0000000..dddbca1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/static-init1.C
@@ -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) };
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 0589fc9..c724fcd 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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: