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

Markus Trippelsdorf <trippels at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2015-08-29
                 CC|                            |trippels at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Markus Trippelsdorf <trippels at gcc dot gnu.org> ---
Confirmed. Loops in:

3014 static tree                                                                
3015 cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,                      
3016                     bool *non_constant_p, bool *overflow_p,                
3017                     tree *jump_target)                                     
3018 {                                                                          
3019   tree body = TREE_OPERAND (t, 0);                                         
3020   while (true)                                                             
3021     {                                                                      
3022       cxx_eval_statement_list (ctx, body,                                  
3023                                non_constant_p, overflow_p, jump_target);   
3024       if (returns (jump_target) || breaks (jump_target) ||
*non_constant_p)                                                                
3025         break;                                                             
3026     }                                                                      
3027   if (breaks (jump_target))                                                
3028     *jump_target = NULL_TREE;                                              
3029   return NULL_TREE;                                                        
3030 }

A variant ICEs:

markus@x4 tmp % cat const.ii
constexpr int foo() {
  while (true)
    ;
  return 0;
}

int i = foo();

markus@x4 tmp % g++ -std=c++14 -c const.ii
const.ii:7:12:   in constexpr expansion of ‘foo()’
const.ii:7:13: internal compiler error: tree check: expected statement_list,
have nop_expr in tsi_start, at tree-iterator.h:42
 int i = foo();
             ^
0xeef92c tree_check_failed(tree_node const*, char const*, int, char const*,
...)
        ../../gcc/gcc/tree.c:9499
0x59db9a tree_check(tree_node*, char const*, int, char const*, tree_code)
        ../../gcc/gcc/tree.h:2858
0x59db9a tsi_start
        ../../gcc/gcc/tree-iterator.h:42
0x7f085f tsi_start
        ../../gcc/gcc/cp/constexpr.c:2949
0x7f085f cxx_eval_statement_list
        ../../gcc/gcc/cp/constexpr.c:2980
0x7eacb6 cxx_eval_loop_expr
        ../../gcc/gcc/cp/constexpr.c:3023
0x7eacb6 cxx_eval_constant_expression
        ../../gcc/gcc/cp/constexpr.c:3646
0x7f06e6 cxx_eval_statement_list
        ../../gcc/gcc/cp/constexpr.c:2996
0x7eb3a4 cxx_eval_constant_expression
        ../../gcc/gcc/cp/constexpr.c:3580
0x7ea3ba cxx_eval_call_expression
        ../../gcc/gcc/cp/constexpr.c:1379
0x7eb191 cxx_eval_constant_expression
        ../../gcc/gcc/cp/constexpr.c:3205
0x7f0991 cxx_eval_outermost_constant_expr
        ../../gcc/gcc/cp/constexpr.c:3740
0x7f2b3f maybe_constant_init(tree_node*, tree_node*)
        ../../gcc/gcc/cp/constexpr.c:3943
0x67f5dc store_init_value(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, int)
        ../../gcc/gcc/cp/typeck2.c:826
0x5e83df check_initializer
        ../../gcc/gcc/cp/decl.c:6089
0x607884 cp_finish_decl(tree_node*, tree_node*, bool, tree_node*, int)
        ../../gcc/gcc/cp/decl.c:6714
0x704895 cp_parser_init_declarator
        ../../gcc/gcc/cp/parser.c:17846
0x707155 cp_parser_simple_declaration
        ../../gcc/gcc/cp/parser.c:11681
0x7008f3 cp_parser_block_declaration
        ../../gcc/gcc/cp/parser.c:11555
0x70c737 cp_parser_declaration
        ../../gcc/gcc/cp/parser.c:11452
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.


markus@x4 tmp % clang++ -Wall -Wextra -std=c++14 -c const.ii
const.ii:1:15: error: constexpr function never produces a constant expression
[-Winvalid-constexpr]
constexpr int foo() {
              ^
const.ii:3:5: note: constexpr evaluation hit maximum step limit; possible
infinite loop?
    ;
    ^
1 error generated.

Reply via email to