From 481817e4b9403845d7dad473bc4d134057265189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez-Ib=C3=A1=C3=B1ez?= Date: Tue, 4 Aug 2009 15:51:12 +0000 Subject: [PATCH] re PR c++/16696 (Strange message when operator++ not found) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2009-08-04 Manuel López-Ibáñez 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 | 6 +++++ gcc/cp/call.c | 22 ++++++++++++++----- gcc/testsuite/ChangeLog | 6 +++++ .../g++.dg/parse/pr16696-permissive.C | 17 ++++++++++++++ gcc/testsuite/g++.dg/parse/pr16696.C | 17 ++++++++++++++ 5 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/pr16696-permissive.C create mode 100644 gcc/testsuite/g++.dg/parse/pr16696.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 506d83c7ffb0..71fed72eb921 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-08-04 Manuel López-Ibáñez + + PR c++/16696 + * call.c (build_new_op): Only try prefix operator if -fpermissive, + otherwise just error. + 2009-08-04 Dodji Seketeli PR debug/39706 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index a667434f7a6d..f6a083bd6776 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 3ee1adce1450..cecd2a13ba0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-08-04 Manuel López-Ibáñez + + PR c++/16696 + * g++.dg/parse/pr16696.C: New. + * g++.dg/parse/pr16696-permissive.C: New. + 2009-08-04 Paul Thomas 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 000000000000..1d8a920ad25e --- /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 000000000000..902e2a1a90b5 --- /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 } +} +