[C++] Avoid redundant error messages from build_x_arrow
diff mbox series

Message ID c2a47783-5f67-1f8a-15a1-d35d73ff932a@oracle.com
State New
Headers show
Series
  • [C++] Avoid redundant error messages from build_x_arrow
Related show

Commit Message

Paolo Carlini Nov. 20, 2019, 4:40 p.m. UTC
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.

//////////////////////////
/gcc
2019-11-20  Paolo Carlini  <paolo.carlini@oracle.com>

	* typeck2.c (build_x_arrow): Early return if decay_conversion
	returns error_mark_node.

/testsuite
2019-11-20  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/parse/error43.C: Adjust expected error.

Comments

Jason Merrill Nov. 20, 2019, 7:04 p.m. UTC | #1
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.

Patch
diff mbox series

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" }