diff mbox series

[C++] PR 86546 (" ICE on invalid: tree_class_check_failed()")

Message ID 68d72058-5ecc-ec06-f5a4-4578592ac905@oracle.com
State New
Headers show
Series [C++] PR 86546 (" ICE on invalid: tree_class_check_failed()") | expand

Commit Message

Paolo Carlini Aug. 28, 2018, 12:43 p.m. UTC
Hi,

this low priority ICE on invalid happens only in c++98 mode but I think 
we can as well avoid it and have consistent error recovery across std 
modes. Essentially, the VAR_DECL for 'b' with erroneous TREE_TYPE (the 
type is incomplete) reaches cxx_eval_constant_expression and we ICE when 
we use COMPLETE_TYPE_P on the TREE_TYPE itself. I think we can - 
consistently across std modes - catch the erroneous type quite a bit 
earlier, midway in finish_case_label, thus before the case_conversion 
call which eventually leads to the ICE. Tested x86_64-linux.

Thanks, Paolo.

/////////////////////
/cp
2018-08-28  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/86546
	* decl.c (finish_case_label): If the type is erroneous early
	return error_mark_node.

/testsuite
2018-08-28  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/86546
	* g++.dg/other/switch4.C: New.

Comments

Nathan Sidwell Aug. 28, 2018, 1:28 p.m. UTC | #1
On 08/28/2018 08:43 AM, Paolo Carlini wrote:
> Hi,
> 
> this low priority ICE on invalid happens only in c++98 mode but I think 
> we can as well avoid it and have consistent error recovery across std 
> modes. Essentially, the VAR_DECL for 'b' with erroneous TREE_TYPE (the 
> type is incomplete) reaches cxx_eval_constant_expression and we ICE when 
> we use COMPLETE_TYPE_P on the TREE_TYPE itself. I think we can - 
> consistently across std modes - catch the erroneous type quite a bit 
> earlier, midway in finish_case_label, thus before the case_conversion 
> call which eventually leads to the ICE. Tested x86_64-linux.

ok
diff mbox series

Patch

Index: cp/decl.c
===================================================================
--- cp/decl.c	(revision 263914)
+++ cp/decl.c	(working copy)
@@ -3662,6 +3662,8 @@  finish_case_label (location_t loc, tree low_value,
     return error_mark_node;
 
   type = SWITCH_STMT_TYPE (switch_stack->switch_stmt);
+  if (type == error_mark_node)
+    return error_mark_node;
 
   low_value = case_conversion (type, low_value);
   high_value = case_conversion (type, high_value);
Index: testsuite/g++.dg/other/switch4.C
===================================================================
--- testsuite/g++.dg/other/switch4.C	(nonexistent)
+++ testsuite/g++.dg/other/switch4.C	(working copy)
@@ -0,0 +1,6 @@ 
+// PR c++/86546
+
+class a b;  // { dg-error "aggregate" }
+void c() {
+  switch ()  // { dg-error "expected" }
+  case b  // { dg-error "expected" }