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.