summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>2009-08-04 15:51:12 +0000
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>2009-08-04 15:51:12 +0000
commitc77db90cb906317c656848229ad7cc74895ac020 (patch)
treeed10113afa8273ad6291ba4ffd28343a25b41bb2
parent484b404d01c718e909610cc80ee2eaef7ee97e72 (diff)
downloadgcc-c77db90cb906317c656848229ad7cc74895ac020.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150461 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c22
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/parse/pr16696-permissive.C17
-rw-r--r--gcc/testsuite/g++.dg/parse/pr16696.C17
5 files changed, 62 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 506d83c7ffb..71fed72eb92 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index a667434f7a6..f6a083bd677 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3ee1adce145..cecd2a13ba0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..1d8a920ad25
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C
@@ -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
index 00000000000..902e2a1a90b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/pr16696.C
@@ -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 }
+}
+