aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2019-03-25 20:43:36 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2019-03-25 20:43:36 +0000
commit0abbc99c023b99e9fad6308f9a0cdfc1599b5b31 (patch)
tree13d977da98f04d907ddc64e1e4ef130468a172bc /gcc
parentb25e675d7de70c530a1ac50f726179c9fd54f161 (diff)
downloadgcc-0abbc99c023b99e9fad6308f9a0cdfc1599b5b31.zip
gcc-0abbc99c023b99e9fad6308f9a0cdfc1599b5b31.tar.gz
gcc-0abbc99c023b99e9fad6308f9a0cdfc1599b5b31.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c26
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/concepts/pr84661.C7
-rw-r--r--gcc/testsuite/g++.dg/torture/pr85013.C3
5 files changed, 38 insertions, 12 deletions
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 <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.
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 <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.
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" }