re PR c++/16696 (Strange message when operator++ not found)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 4 Aug 2009 15:51:12 +0000 (15:51 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 4 Aug 2009 15:51:12 +0000 (15:51 +0000)
2009-08-04  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c++/16696
cp/
* call.c (build_new_op): Only try prefix operator if -fpermissive,
otherwise just error.
testsuite/
* g++.dg/parse/pr16696.C: New.
* g++.dg/parse/pr16696-permissive.C: New.

From-SVN: r150461

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/pr16696-permissive.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/pr16696.C [new file with mode: 0644]

index 506d83c7ffb07eb3606e59d5d11e233d7dfd5e78..71fed72eb921f14bdacd90d20ae012541afe9062 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-04  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c++/16696
+       * call.c (build_new_op): Only try prefix operator if -fpermissive,
+       otherwise just error.
+
 2009-08-04  Dodji Seketeli  <dodji@redhat.com>
 
        PR debug/39706
index a667434f7a6d27c450b411dcc1b11e9267d84415..f6a083bd6776aeeedf462b7e5adc1583c6e08e46 100644 (file)
@@ -4255,13 +4255,23 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
          if (!(complain & tf_error))
            return error_mark_node;
 
-         /* Look for an `operator++ (int)'.  If they didn't have
-            one, then we fall back to the old way of doing things.  */
+         /* Look for an `operator++ (int)'. Pre-1985 C++ didn't
+            distinguish between prefix and postfix ++ and
+            operator++() was used for both, so we allow this with
+            -fpermissive.  */
          if (flags & LOOKUP_COMPLAIN)
-           permerror (input_location, "no %<%D(int)%> declared for postfix %qs, "
-                      "trying prefix operator instead",
-                      fnname,
-                      operator_name_info[code].name);
+           {
+             const char *msg = (flag_permissive) 
+               ? G_("no %<%D(int)%> declared for postfix %qs,"
+                    " trying prefix operator instead")
+               : G_("no %<%D(int)%> declared for postfix %qs");
+             permerror (input_location, msg, fnname,
+                        operator_name_info[code].name);
+           }
+
+         if (!flag_permissive)
+           return error_mark_node;
+
          if (code == POSTINCREMENT_EXPR)
            code = PREINCREMENT_EXPR;
          else
index 3ee1adce14500f12b12bceaddffd4509305e51b9..cecd2a13ba0b1a744d3dff595e6c580fba986296 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-04  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c++/16696
+       * g++.dg/parse/pr16696.C: New.
+       * g++.dg/parse/pr16696-permissive.C: New.
+
 2009-08-04  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/40875
diff --git a/gcc/testsuite/g++.dg/parse/pr16696-permissive.C b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C
new file mode 100644 (file)
index 0000000..1d8a920
--- /dev/null
@@ -0,0 +1,17 @@
+// PR 16696 Strange message when operator++ not found
+// { dg-do compile } 
+// { dg-options "-fdiagnostics-show-option -fpermissive" } 
+
+
+struct X { void operator++(); }; 
+struct Y { };
+
+int main () { 
+  X x; 
+  Y y;
+  x++; // { dg-warning "trying prefix operator" } 
+
+  y++; // { dg-warning "trying prefix operator" } 
+  // { dg-error "no match" "" { target *-*-* } 14 }
+} 
+
diff --git a/gcc/testsuite/g++.dg/parse/pr16696.C b/gcc/testsuite/g++.dg/parse/pr16696.C
new file mode 100644 (file)
index 0000000..902e2a1
--- /dev/null
@@ -0,0 +1,17 @@
+// PR 16696 Strange message when operator++ not found
+// { dg-do compile } 
+// { dg-options "-fdiagnostics-show-option" } 
+
+
+struct X { void operator++(); }; 
+struct Y { };
+
+int main () { 
+  X x; 
+  Y y;
+  x++; // { dg-bogus "trying prefix operator" } 
+  // { dg-error "fpermissive" "" { target *-*-* } 12 }
+  y++; // { dg-bogus "trying prefix operator" } 
+  // { dg-error "fpermissive" "" { target *-*-* } 14 }
+} 
+