re PR c++/79377 (ICE with increment operator in -fpermissive mode)
authorJakub Jelinek <jakub@redhat.com>
Mon, 6 Feb 2017 20:05:09 +0000 (21:05 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 6 Feb 2017 20:05:09 +0000 (21:05 +0100)
PR c++/79377
* tree.c (build_min_non_dep_op_overload): For POST{INC,DEC}REMENT_EXPR
allow one fewer than expected arguments if flag_permissive.

* g++.dg/lookup/pr79377.C: New test.

From-SVN: r245219

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/pr79377.C [new file with mode: 0644]

index 9889c171b017451013d0929d411f583315d78262..a318c7fb8b8d71b021c230e61b9ab37b3cb51ae1 100644 (file)
@@ -1,5 +1,9 @@
 2017-02-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/79377
+       * tree.c (build_min_non_dep_op_overload): For POST{INC,DEC}REMENT_EXPR
+       allow one fewer than expected arguments if flag_permissive.
+
        PR c++/79372
        * decl.c (cp_finish_decomp): On error set decl type to error_mark_node.
        * pt.c (tsubst_expr): Don't call tsubst_decomp_names on decompositions
index 3ecc2b00fefa6bb70deffecb9fbb52d7e4961837..afd442f580168e9bd71e66b292f2c387d4d4ed8b 100644 (file)
@@ -2938,8 +2938,10 @@ build_min_non_dep_op_overload (enum tree_code op,
   nargs = call_expr_nargs (non_dep);
 
   expected_nargs = cp_tree_code_length (op);
-  if (op == POSTINCREMENT_EXPR
-      || op == POSTDECREMENT_EXPR)
+  if ((op == POSTINCREMENT_EXPR
+       || op == POSTDECREMENT_EXPR)
+      /* With -fpermissive non_dep could be operator++().  */
+      && (!flag_permissive || nargs != expected_nargs))
     expected_nargs += 1;
   gcc_assert (nargs == expected_nargs);
 
index 954851b961dc34e1b776a920d3b5781fc6423f9d..3313268a639cc0467bc336a49e85c485278252fe 100644 (file)
@@ -1,5 +1,8 @@
 2017-02-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/79377
+       * g++.dg/lookup/pr79377.C: New test.
+
        PR c++/79372
        * g++.dg/cpp1z/decomp25.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/lookup/pr79377.C b/gcc/testsuite/g++.dg/lookup/pr79377.C
new file mode 100644 (file)
index 0000000..baf9a25
--- /dev/null
@@ -0,0 +1,36 @@
+// PR c++/79377
+// { dg-do run }
+// { dg-options "-fpermissive" }
+
+struct A
+{
+  A () : a (0) {}
+  A& operator++ () { ++a; ++c; return *this; }
+  int a;
+  static int c;
+};
+
+int A::c = 0;
+
+template <typename>
+void
+foo (A& a)
+{
+  a++;         // { dg-warning "trying prefix operator instead" }
+  if (A::c != 3 || a.a != 3) __builtin_abort ();
+  ++a;
+  if (A::c != 4 || a.a != 4) __builtin_abort ();
+}
+
+int
+main ()
+{
+  A a;
+  if (A::c != 0 || a.a != 0) __builtin_abort ();
+  ++a;
+  if (A::c != 1 || a.a != 1) __builtin_abort ();
+  a++;         // { dg-warning "trying prefix operator instead" }
+  if (A::c != 2 || a.a != 2) __builtin_abort ();
+  foo<int> (a);
+  if (A::c != 4 || a.a != 4) __builtin_abort ();
+}