re PR c++/84661 (internal compiler error: Segmentation fault (strip_array_types()))
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 25 Mar 2019 20:43:36 +0000 (20:43 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 25 Mar 2019 20:43:36 +0000 (20:43 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/concepts/pr84661.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr85013.C [new file with mode: 0644]

index 5739c38231637bd679f9177ee10b3700c16695b2..703c0f11696ba0c23a4a842e292f75b5b331c256 100644 (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.
index c669e49214f45be90c5bf48c82e14f7d403139a5..4119d2a32659980937a32f203fb4f3da2fec7139 100644 (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
index 82981ad2a4c3e7927b43ed9b7ddf488eee6cfc02..00d17404dda3f9430d3130c1477bf1090d22f39c 100644 (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.
diff --git a/gcc/testsuite/g++.dg/concepts/pr84661.C b/gcc/testsuite/g++.dg/concepts/pr84661.C
new file mode 100644 (file)
index 0000000..3f63863
--- /dev/null
@@ -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 (file)
index 0000000..6da3e2e
--- /dev/null
@@ -0,0 +1,3 @@
+// { dg-additional-options "-std=c++14 -fconcepts" }
+
+a(decltype((0 > 1e91 && 1e31 && (auto))));  // { dg-error "expected" }