https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67398

--- Comment #6 from Mikhail Maltsev <miyuki at gcc dot gnu.org> ---
$ cat test4_min.cc 
struct B {
  void *extradata;
};

template <typename>
class C {
  static const B b;
  virtual void m_fn1() { (void)b; }
};

template <typename>
struct strdata_t {
    int data[];
};

template <typename T>
const B C<T>::b{strdata_t<T>{}.data};

C<int> c;

$ cc1plus test4_min.cc                                                          
test4_min.cc: In function 'void __static_initialization_and_destruction_0(int,
int)':
test4_min.cc:17:9: internal compiler error: in make_decl_rtl, at varasm.c:1306
 const B C<T>::b{strdata_t<T>{}.data};
         ^
0xf53495 make_decl_rtl(tree_node*)
        /home/miyuki/gcc/src/gcc/varasm.c:1302
0x9cfb79 expand_expr_real_1(tree_node*, rtx_def*, machine_mode,
expand_modifier, rtx_def**, bool)
        /home/miyuki/gcc/src/gcc/expr.c:9525
0x9d9dc6 expand_expr
        /home/miyuki/gcc/src/gcc/expr.h:255
0x9d9dc6 expand_expr_addr_expr_1
        /home/miyuki/gcc/src/gcc/expr.c:7600

Reproduced on trunk. BTW, Clang accepts it, but issues a warning (apparently, I
overlooked that the error in my previous comment was caused by invalid
constexpr initialization):

test4_min.cc:17:17: warning: pointer is initialized by a temporary array, which
will be destroyed at the end of the full-expression
[-Waddress-of-array-temporary]
const B C<T>::b{strdata_t<T>{}.data};

Reply via email to