aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2009-08-04 15:51:12 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2009-08-04 15:51:12 +0000
commit481817e4b9403845d7dad473bc4d134057265189 (patch)
treeed10113afa8273ad6291ba4ffd28343a25b41bb2 /gcc
parent1b2dc47dd633bf83ec5f0730de51a3c0d0cf10c9 (diff)
downloadgcc-481817e4b9403845d7dad473bc4d134057265189.zip
gcc-481817e4b9403845d7dad473bc4d134057265189.tar.gz
gcc-481817e4b9403845d7dad473bc4d134057265189.tar.bz2
re PR c++/16696 (Strange message when operator++ not found)
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
Diffstat (limited to 'gcc')
-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 506d83c..71fed72 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 a667434..f6a083b 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 3ee1adc..cecd2a1 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 0000000..1d8a920
--- /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 0000000..902e2a1
--- /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 }
+}
+