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

            Bug ID: 79607
           Summary: [5/6/7 Regression] ICE with brace-initialization of
                    static const member
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: reichelt at gcc dot gnu.org
  Target Milestone: ---

The following valid code snippet triggers an ICE since GCC 5.1.0:

=====================================
template<typename T> struct A
{
  static const int i = int{T{}};
};

A<int> a;
=====================================

bug.cc:3:31: internal compiler error: in verify_ctor_sanity, at
cp/constexpr.c:2633
   static const int i = int{T{}};
                               ^
0x834b57 verify_ctor_sanity
        ../../gcc/gcc/cp/constexpr.c:2633
0x83a4ff cxx_eval_bare_aggregate
        ../../gcc/gcc/cp/constexpr.c:2669
0x83a4ff cxx_eval_constant_expression
        ../../gcc/gcc/cp/constexpr.c:4314
0x83fb1e cxx_eval_outermost_constant_expr
        ../../gcc/gcc/cp/constexpr.c:4613
0x6b4062 store_init_value(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, int)
        ../../gcc/gcc/cp/typeck2.c:817
0x61034b check_initializer
        ../../gcc/gcc/cp/decl.c:6362
0x63cac6 cp_finish_decl(tree_node*, tree_node*, bool, tree_node*, int)
        ../../gcc/gcc/cp/decl.c:6930
0x6ec6fe grokfield(cp_declarator const*, cp_decl_specifier_seq*, tree_node*,
bool, tree_node*, tree_node*)
        ../../gcc/gcc/cp/decl2.c:961
0x719b03 cp_parser_member_declaration
        ../../gcc/gcc/cp/parser.c:23404
0x71a6ba cp_parser_member_specification_opt
        ../../gcc/gcc/cp/parser.c:22953
0x71a6ba cp_parser_class_specifier_1
        ../../gcc/gcc/cp/parser.c:22109
0x71cc19 cp_parser_class_specifier
        ../../gcc/gcc/cp/parser.c:22361
0x71cc19 cp_parser_type_specifier
        ../../gcc/gcc/cp/parser.c:16434
0x71db0a cp_parser_decl_specifier_seq
        ../../gcc/gcc/cp/parser.c:13347
0x719305 cp_parser_single_declaration
        ../../gcc/gcc/cp/parser.c:26628
0x73b25c cp_parser_template_declaration_after_parameters
        ../../gcc/gcc/cp/parser.c:26322
0x73aeec cp_parser_explicit_template_declaration
        ../../gcc/gcc/cp/parser.c:26557
0x73aeec cp_parser_template_declaration_after_export
        ../../gcc/gcc/cp/parser.c:26576
0x743009 cp_parser_declaration
        ../../gcc/gcc/cp/parser.c:12466
0x744b1b cp_parser_declaration_seq_opt
        ../../gcc/gcc/cp/parser.c:12393
Please submit a full bug report, [etc.]

A similar code snippet is wrongly rejected:

=====================================
template<typename T> struct A
{
  static const int i = T{};
};

A<int> a;
=====================================

bug.cc:3:26: error: cannot convert 'T' to 'const int' in initialization
   static const int i = T{};
                          ^

Both code snippets compile, if I replace 'T{}' by 'T()'.

Reply via email to