diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2009-08-04 15:51:12 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2009-08-04 15:51:12 +0000 |
commit | 481817e4b9403845d7dad473bc4d134057265189 (patch) | |
tree | ed10113afa8273ad6291ba4ffd28343a25b41bb2 /gcc | |
parent | 1b2dc47dd633bf83ec5f0730de51a3c0d0cf10c9 (diff) | |
download | gcc-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/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 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 } +} + |