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
This commit is contained in:
parent
68c512f66d
commit
d8028f2cc3
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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" } }
|
||||
|
|
|
@ -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) };
|
12
gcc/varasm.c
12
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;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case MINUS_EXPR:
|
||||
|
|
Loading…
Reference in New Issue