From: Paolo Carlini Date: Mon, 25 Mar 2019 20:43:36 +0000 (+0000) Subject: re PR c++/84661 (internal compiler error: Segmentation fault (strip_array_types())) X-Git-Tag: upstream/12.2.0~25498 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0abbc99c023b99e9fad6308f9a0cdfc1599b5b31;p=platform%2Fupstream%2Fgcc.git re PR c++/84661 (internal compiler error: Segmentation fault (strip_array_types())) /cp 2019-03-25 Paolo Carlini PR c++/84661 PR c++/85013 * parser.c (cp_parser_binary_expression): Don't call cp_fully_fold to undo the disabling of warnings. /testsuite 2019-03-25 Paolo Carlini PR c++/84661 PR c++/85013 * g++.dg/concepts/pr84661.C: New. * g++.dg/torture/pr85013.C: Likewise. From-SVN: r269923 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5739c38..703c0f1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2019-03-25 Paolo Carlini + + PR c++/84661 + PR c++/85013 + * parser.c (cp_parser_binary_expression): Don't call cp_fully_fold + to undo the disabling of warnings. + 2019-03-25 Jason Merrill PR c++/87748 - substitution failure error with decltype. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c669e49..4119d2a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -9443,6 +9443,7 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p, { cp_parser_expression_stack stack; cp_parser_expression_stack_entry *sp = &stack[0]; + cp_parser_expression_stack_entry *disable_warnings_sp = NULL; cp_parser_expression_stack_entry current; cp_expr rhs; cp_token *token; @@ -9506,12 +9507,14 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p, /* For "false && x" or "true || x", x will never be executed; disable warnings while evaluating it. */ - if (current.tree_type == TRUTH_ANDIF_EXPR) - c_inhibit_evaluation_warnings += - cp_fully_fold (current.lhs) == truthvalue_false_node; - else if (current.tree_type == TRUTH_ORIF_EXPR) - c_inhibit_evaluation_warnings += - cp_fully_fold (current.lhs) == truthvalue_true_node; + if ((current.tree_type == TRUTH_ANDIF_EXPR + && cp_fully_fold (current.lhs) == truthvalue_false_node) + || (current.tree_type == TRUTH_ORIF_EXPR + && cp_fully_fold (current.lhs) == truthvalue_true_node)) + { + disable_warnings_sp = sp; + ++c_inhibit_evaluation_warnings; + } /* Extract another operand. It may be the RHS of this expression or the LHS of a new, higher priority expression. */ @@ -9557,12 +9560,11 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p, } /* Undo the disabling of warnings done above. */ - if (current.tree_type == TRUTH_ANDIF_EXPR) - c_inhibit_evaluation_warnings -= - cp_fully_fold (current.lhs) == truthvalue_false_node; - else if (current.tree_type == TRUTH_ORIF_EXPR) - c_inhibit_evaluation_warnings -= - cp_fully_fold (current.lhs) == truthvalue_true_node; + if (sp == disable_warnings_sp) + { + disable_warnings_sp = NULL; + --c_inhibit_evaluation_warnings; + } if (warn_logical_not_paren && TREE_CODE_CLASS (current.tree_type) == tcc_comparison diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 82981ad..00d1740 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-03-25 Paolo Carlini + + PR c++/84661 + PR c++/85013 + * g++.dg/concepts/pr84661.C: New. + * g++.dg/torture/pr85013.C: Likewise. + 2019-03-25 Marek Polacek PR c++/89214 - ICE when initializing aggregates with bases. diff --git a/gcc/testsuite/g++.dg/concepts/pr84661.C b/gcc/testsuite/g++.dg/concepts/pr84661.C new file mode 100644 index 0000000..3f63863 --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/pr84661.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++14 } } +// { dg-additional-options "-fconcepts" } + +struct S { + int &a; + void foo (decltype(((a = 0) || ((auto))))); // { dg-error "expected" } +}; diff --git a/gcc/testsuite/g++.dg/torture/pr85013.C b/gcc/testsuite/g++.dg/torture/pr85013.C new file mode 100644 index 0000000..6da3e2e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr85013.C @@ -0,0 +1,3 @@ +// { dg-additional-options "-std=c++14 -fconcepts" } + +a(decltype((0 > 1e91 && 1e31 && (auto)))); // { dg-error "expected" }