Message ID | c2a47783-5f67-1f8a-15a1-d35d73ff932a@oracle.com |
---|---|
State | New |
Headers | show |
Series | [C++] Avoid redundant error messages from build_x_arrow | expand |
On 11/20/19 4:40 PM, Paolo Carlini wrote: > Hi, > > while working on improving the locations of cp_build_indirect_ref_1 & > co, I noticed this nit which seems a separate issue. > > In a nutshell, at variance with many other cases, in build_x_arrow we > don't immediately check for error_mark_node the return value of > decay_conversion. Then, for the testcase, after a sensible: > > error: invalid use of member function ‘C* C::f()’ (did you forget the > ‘()’ ?) > > we also issue: > > error: base operand of ‘->’ is not a pointer > > which is certainly redundant and a bit misleading, is talking about the > 'f' mentioned in the first message. The amended behavior is also > consistent with EDG and CLANG. > > Tested x86_64-linux, as usual. > > Thanks, Paolo. > > ////////////////////////// > OK.
Index: cp/typeck2.c =================================================================== --- cp/typeck2.c (revision 278499) +++ cp/typeck2.c (working copy) @@ -2044,7 +2044,11 @@ build_x_arrow (location_t loc, tree expr, tsubst_f last_rval = convert_from_reference (last_rval); } else - last_rval = decay_conversion (expr, complain); + { + last_rval = decay_conversion (expr, complain); + if (last_rval == error_mark_node) + return error_mark_node; + } if (TYPE_PTR_P (TREE_TYPE (last_rval))) { Index: testsuite/g++.dg/parse/error43.C =================================================================== --- testsuite/g++.dg/parse/error43.C (revision 278499) +++ testsuite/g++.dg/parse/error43.C (working copy) @@ -2,4 +2,4 @@ // { dg-options "" } class C { public: C* f(); int get(); }; -int f(C* p) { return p->f->get(); } // { dg-error "forget the '\\(\\)'|base operand" } +int f(C* p) { return p->f->get(); } // { dg-error "25:invalid use of member function" }