diff options
author | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-04 15:51:12 +0000 |
---|---|---|
committer | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-08-04 15:51:12 +0000 |
commit | c77db90cb906317c656848229ad7cc74895ac020 (patch) | |
tree | ed10113afa8273ad6291ba4ffd28343a25b41bb2 | |
parent | 484b404d01c718e909610cc80ee2eaef7ee97e72 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr16696-permissive.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr16696.C | 17 |
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 } +} + |