Bug#767668: gcc-4.9: gcc internal compiler error with atomic_compare_exchange_weak_explicit
Package: gcc-4.9
Version: 4.9.1-16
Severity: normal
Dear Maintainer,
the attached code leads to an internal compiler error. I didn't try it with
upstream GCC, only with GCC from debian testing.
I'm attaching both a minimal version of the source to trigger the bug
and the preprocessed source.
Thanks,
Daniele
-- System Information:
Debian Release: jessie/sid
APT prefers testing
APT policy: (700, 'testing'), (650, 'unstable'), (600, 'experimental'), (500, 'testing-updates')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.16-3-amd64 (SMP w/2 CPU cores)
Locale: LANG=it_IT.utf8, LC_CTYPE=it_IT.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages gcc-4.9 depends on:
ii binutils 2.24.90.20141023-1
ii cpp-4.9 4.9.1-16
ii gcc-4.9-base 4.9.1-16
ii libc6 2.19-12
ii libcloog-isl4 0.18.2-1
ii libgcc-4.9-dev 4.9.1-16
ii libgmp10 2:6.0.0+dfsg-6
ii libisl10 0.12.2-2
ii libmpc3 1.0.2-1
ii libmpfr4 3.1.2-1
ii zlib1g 1:1.2.8.dfsg-2
Versions of packages gcc-4.9 recommends:
ii libc6-dev 2.19-12
Versions of packages gcc-4.9 suggests:
pn gcc-4.9-doc <none>
pn gcc-4.9-locales <none>
ii gcc-4.9-multilib 4.9.1-16
pn libasan1-dbg <none>
pn libatomic1-dbg <none>
pn libcilkrts5-dbg <none>
pn libgcc1-dbg <none>
pn libgomp1-dbg <none>
pn libitm1-dbg <none>
pn liblsan0-dbg <none>
pn libquadmath0-dbg <none>
pn libtsan0-dbg <none>
pn libubsan0-dbg <none>
-- no debconf information
/* testatomic.c */
#include <stdatomic.h>
#include <stdbool.h>
struct myrcu_pointer
{
_Atomic(void *) p;
};
bool
myrcu_compare_exchange__(struct myrcu_pointer *pointer, const void *exp,
void *value, memory_order order_succ,
memory_order order_fail)
{
return atomic_compare_exchange_weak_explicit(&pointer->p, (void *) exp,
value, order_succ,
order_fail);
}
// /usr/lib/gcc/x86_64-linux-gnu/4.9/cc1 -quiet -imultiarch x86_64-linux-gnu testatomic.c -quiet -dumpbase testatomic.c -mtune=generic -march=x86-64 -auxbase testatomic -o - -frandom-seed=0
# 1 "testatomic.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "testatomic.c"
# 1 "/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdatomic.h" 1 3 4
# 29 "/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdatomic.h" 3 4
typedef enum
{
memory_order_relaxed = 0,
memory_order_consume = 1,
memory_order_acquire = 2,
memory_order_release = 3,
memory_order_acq_rel = 4,
memory_order_seq_cst = 5
} memory_order;
typedef _Atomic _Bool atomic_bool;
typedef _Atomic char atomic_char;
typedef _Atomic signed char atomic_schar;
typedef _Atomic unsigned char atomic_uchar;
typedef _Atomic short atomic_short;
typedef _Atomic unsigned short atomic_ushort;
typedef _Atomic int atomic_int;
typedef _Atomic unsigned int atomic_uint;
typedef _Atomic long atomic_long;
typedef _Atomic unsigned long atomic_ulong;
typedef _Atomic long long atomic_llong;
typedef _Atomic unsigned long long atomic_ullong;
typedef _Atomic short unsigned int atomic_char16_t;
typedef _Atomic unsigned int atomic_char32_t;
typedef _Atomic int atomic_wchar_t;
typedef _Atomic signed char atomic_int_least8_t;
typedef _Atomic unsigned char atomic_uint_least8_t;
typedef _Atomic short int atomic_int_least16_t;
typedef _Atomic short unsigned int atomic_uint_least16_t;
typedef _Atomic int atomic_int_least32_t;
typedef _Atomic unsigned int atomic_uint_least32_t;
typedef _Atomic long int atomic_int_least64_t;
typedef _Atomic long unsigned int atomic_uint_least64_t;
typedef _Atomic signed char atomic_int_fast8_t;
typedef _Atomic unsigned char atomic_uint_fast8_t;
typedef _Atomic long int atomic_int_fast16_t;
typedef _Atomic long unsigned int atomic_uint_fast16_t;
typedef _Atomic long int atomic_int_fast32_t;
typedef _Atomic long unsigned int atomic_uint_fast32_t;
typedef _Atomic long int atomic_int_fast64_t;
typedef _Atomic long unsigned int atomic_uint_fast64_t;
typedef _Atomic long int atomic_intptr_t;
typedef _Atomic long unsigned int atomic_uintptr_t;
typedef _Atomic long unsigned int atomic_size_t;
typedef _Atomic long int atomic_ptrdiff_t;
typedef _Atomic long int atomic_intmax_t;
typedef _Atomic long unsigned int atomic_uintmax_t;
# 232 "/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdatomic.h" 3 4
typedef _Atomic struct
{
_Bool __val;
} atomic_flag;
# 3 "testatomic.c" 2
# 1 "/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdbool.h" 1 3 4
# 4 "testatomic.c" 2
struct myrcu_pointer
{
_Atomic(void *) p;
};
_Bool
myrcu_compare_exchange__(struct myrcu_pointer *pointer, const void *exp,
void *value, memory_order order_succ,
memory_order order_fail)
{
return __extension__ ({ __auto_type __atomic_compare_exchange_ptr = (&pointer->p); __typeof__ (*__atomic_compare_exchange_ptr) __atomic_compare_exchange_tmp = (value); __atomic_compare_exchange (__atomic_compare_exchange_ptr, ((void *) exp), &__atomic_compare_exchange_tmp, 1, (order_succ), (order_fail)); })
;
}
Reply to: