Bug 84333 - [7 Regression] ICE with ternary operator in template function
Summary: [7 Regression] ICE with ternary operator in template function
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 8.0
: P2 normal
Target Milestone: 8.0
Assignee: Paolo Carlini
URL:
Keywords: ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2018-02-12 13:38 UTC by Volker Reichelt
Modified: 2019-11-14 11:06 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work: 8.0
Known to fail: 7.5.0
Last reconfirmed: 2018-02-12 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Volker Reichelt 2018-02-12 13:38:05 UTC
The following valid code snippet triggers an ICE since GCC 6.1.0:

=========================================
template<typename> int foo()
{
  return sizeof(int) > 1 ? : 1;
}
=========================================

bug.cc: In function 'int foo()':
bug.cc:3:30: internal compiler error: tree check: did not expect class 'type', have 'type' (integer_type) in contains_placeholder_p, at tree.c:3743
   return sizeof(int) > 1 ? : 1;
                              ^
0x78a86d tree_not_class_check_failed(tree_node const*, tree_code_class, char const*, int, char const*)
	../../gcc/gcc/tree.c:9434
0x78dd72 non_type_check(tree_node*, char const*, int, char const*)
	../../gcc/gcc/tree.h:3311
0x78dd72 contains_placeholder_p(tree_node const*)
	../../gcc/gcc/tree.c:3743
0x11412a5 contains_placeholder_p(tree_node const*)
	../../gcc/gcc/tree.c:3745
0x1141042 contains_placeholder_p(tree_node const*)
	../../gcc/gcc/tree.c:3746
0x1141723 save_expr(tree_node*)
	../../gcc/gcc/tree.c:3571
0x82af04 build_conditional_expr_1
	../../gcc/gcc/cp/call.c:4808
0x82c44a build_conditional_expr(unsigned int, tree_node*, tree_node*, tree_node*, int)
	../../gcc/gcc/cp/call.c:5390
0x9d0095 build_x_conditional_expr(unsigned int, tree_node*, tree_node*, tree_node*, int)
	../../gcc/gcc/cp/typeck.c:6563
0x913cc3 cp_parser_question_colon_clause
	../../gcc/gcc/cp/parser.c:9441
0x913064 cp_parser_assignment_expression
	../../gcc/gcc/cp/parser.c:9480
0x913708 cp_parser_expression
	../../gcc/gcc/cp/parser.c:9643
0x91be8b cp_parser_jump_statement
	../../gcc/gcc/cp/parser.c:12396
0x91be8b cp_parser_statement
	../../gcc/gcc/cp/parser.c:10810
0x91cc30 cp_parser_statement_seq_opt
	../../gcc/gcc/cp/parser.c:11255
0x91cd07 cp_parser_compound_statement
	../../gcc/gcc/cp/parser.c:11209
0x933460 cp_parser_function_body
	../../gcc/gcc/cp/parser.c:21747
0x933460 cp_parser_ctor_initializer_opt_and_function_body
	../../gcc/gcc/cp/parser.c:21784
0x933d10 cp_parser_function_definition_after_declarator
	../../gcc/gcc/cp/parser.c:26685
0x934a27 cp_parser_function_definition_from_specifiers_and_declarator
	../../gcc/gcc/cp/parser.c:26601
Please submit a full bug report, [etc.]
Comment 1 Paolo Carlini 2018-02-12 16:03:40 UTC
Seems doable.
Comment 2 paolo@gcc.gnu.org 2018-02-13 21:23:54 UTC
Author: paolo
Date: Tue Feb 13 21:23:22 2018
New Revision: 257638

URL: https://gcc.gnu.org/viewcvs?rev=257638&root=gcc&view=rev
Log:
/cp
2018-02-13  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/84333
	* call.c (build_conditional_expr_1): Use cp_save_expr instead of
	save_expr for the G++ extension.

/testsuite
2018-02-13  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/84333
	* g++.dg/template/sizeof16.C: New.
	* g++.dg/template/sizeof17.C: Likewise.

Added:
    trunk/gcc/testsuite/g++.dg/template/sizeof16.C
    trunk/gcc/testsuite/g++.dg/template/sizeof17.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c
    trunk/gcc/testsuite/ChangeLog
Comment 3 Paolo Carlini 2018-02-13 21:36:02 UTC
Fixed in trunk.
Comment 4 Jakub Jelinek 2018-10-26 10:06:26 UTC
GCC 6 branch is being closed
Comment 5 Richard Biener 2019-11-14 11:06:24 UTC
Fixed in GCC 8.