re PR c++/84661 (internal compiler error: Segmentation fault (strip_array_types()))

/cp
2019-03-25  Paolo Carlini  <paolo.carlini@oracle.com>

	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  <paolo.carlini@oracle.com>

	PR c++/84661
	PR c++/85013
	* g++.dg/concepts/pr84661.C: New.
	* g++.dg/torture/pr85013.C: Likewise.

From-SVN: r269923
This commit is contained in:
Paolo Carlini 2019-03-25 20:43:36 +00:00 committed by Paolo Carlini
parent b25e675d7d
commit 0abbc99c02
5 changed files with 38 additions and 12 deletions

View file

@ -1,3 +1,10 @@
2019-03-25 Paolo Carlini <paolo.carlini@oracle.com>
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 <jason@redhat.com>
PR c++/87748 - substitution failure error with decltype.

View file

@ -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

View file

@ -1,3 +1,10 @@
2019-03-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84661
PR c++/85013
* g++.dg/concepts/pr84661.C: New.
* g++.dg/torture/pr85013.C: Likewise.
2019-03-25 Marek Polacek <polacek@redhat.com>
PR c++/89214 - ICE when initializing aggregates with bases.

View file

@ -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" }
};

View file

@ -0,0 +1,3 @@
// { dg-additional-options "-std=c++14 -fconcepts" }
a(decltype((0 > 1e91 && 1e31 && (auto)))); // { dg-error "expected" }