mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 22:51:29 +08:00
re PR middle-end/80163 (ICE on hopefully valid code)
PR middle-end/80163 * varasm.c (initializer_constant_valid_p_1): Disallow sign-extending conversions to integer types wider than word and pointer. * gcc.dg/pr80163.c: New test. From-SVN: r246607
This commit is contained in:
parent
005f12bf67
commit
a7d5515419
@ -1,5 +1,9 @@
|
||||
2017-03-31 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/80163
|
||||
* varasm.c (initializer_constant_valid_p_1): Disallow sign-extending
|
||||
conversions to integer types wider than word and pointer.
|
||||
|
||||
PR debug/80025
|
||||
* cselib.h (rtx_equal_for_cselib_1): Add depth argument.
|
||||
(rtx_equal_for_cselib_p): Pass 0 to it.
|
||||
|
@ -1,5 +1,8 @@
|
||||
2017-03-31 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/80163
|
||||
* gcc.dg/pr80163.c: New test.
|
||||
|
||||
PR debug/80025
|
||||
* gcc.dg/torture/pr80025.c: New test.
|
||||
|
||||
|
22
gcc/testsuite/gcc.dg/pr80163.c
Normal file
22
gcc/testsuite/gcc.dg/pr80163.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* PR middle-end/80163 */
|
||||
/* { dg-do compile { target int128 } } */
|
||||
/* { dg-options "-O0" } */
|
||||
|
||||
void bar (void);
|
||||
|
||||
__int128_t *
|
||||
foo (void)
|
||||
{
|
||||
a:
|
||||
bar ();
|
||||
b:;
|
||||
static __int128_t d = (long) &&a - (long) &&b; /* { dg-error "initializer element is not computable at load time" } */
|
||||
return &d;
|
||||
}
|
||||
|
||||
__int128_t *
|
||||
baz (void)
|
||||
{
|
||||
static __int128_t d = (long) (3 * 4);
|
||||
return &d;
|
||||
}
|
11
gcc/varasm.c
11
gcc/varasm.c
@ -4472,8 +4472,15 @@ initializer_constant_valid_p_1 (tree value, tree endtype, tree *cache)
|
||||
return initializer_constant_valid_p_1 (src, endtype, cache);
|
||||
|
||||
/* Allow conversions between other integer types only if
|
||||
explicit value. */
|
||||
if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
|
||||
explicit value. Don't allow sign-extension to a type larger
|
||||
than word and pointer, there aren't relocations that would
|
||||
allow to sign extend it to a wider type. */
|
||||
if (INTEGRAL_TYPE_P (dest_type)
|
||||
&& INTEGRAL_TYPE_P (src_type)
|
||||
&& (TYPE_UNSIGNED (src_type)
|
||||
|| TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type)
|
||||
|| TYPE_PRECISION (dest_type) <= BITS_PER_WORD
|
||||
|| TYPE_PRECISION (dest_type) <= POINTER_SIZE))
|
||||
{
|
||||
tree inner = initializer_constant_valid_p_1 (src, endtype, cache);
|
||||
if (inner == null_pointer_node)
|
||||
|
Loading…
x
Reference in New Issue
Block a user