This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C++ PATCH] Improve location of CALL_EXPRs (PR c++/60862)


Today I've been playing again with locations in the C++ FE, but of
CALL_EXPRs only this time.  It seems that it's simplest to just set
the location after finish_call_expr does its work rather than to add
many new parameters here and there and pass the location all the way
down to build_cxx_call.  The issue is that build_cxx_call has
7437   location_t loc = EXPR_LOC_OR_LOC (fn, input_location);
7438   fn = build_call_a (fn, nargs, argarray);
7439   SET_EXPR_LOCATION (fn, loc);
but FN is often a FUNCTION_DECL, which cannot carry a location. 

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2014-09-12  Marek Polacek  <polacek@redhat.com>

	PR c++/60862
gcc/cp/
	* parser.c (cp_parser_postfix_expression) <case CPP_OPEN_PAREN>: Set
	location of a call expression.
gcc/testsuite/
	* g++.dg/diagnostic/pr60862.C: New test.
libstdc++-v3/
	* testsuite/20_util/bind/ref_neg.cc (test01): Adjust dg-error line
	numbers.

diff --git gcc/gcc/cp/parser.c gcc/gcc/cp/parser.c
index c696fd2..1bb72bc 100644
--- gcc/gcc/cp/parser.c
+++ gcc/gcc/cp/parser.c
@@ -6227,6 +6227,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
 				    koenig_p,
 				    complain);
 
+	    protected_set_expr_location (postfix_expression, loc);
+
 	    /* The POSTFIX_EXPRESSION is certainly no longer an id.  */
 	    idk = CP_ID_KIND_NONE;
 
diff --git gcc/gcc/testsuite/g++.dg/diagnostic/pr60862.C gcc/gcc/testsuite/g++.dg/diagnostic/pr60862.C
index e69de29..73b7654 100644
--- gcc/gcc/testsuite/g++.dg/diagnostic/pr60862.C
+++ gcc/gcc/testsuite/g++.dg/diagnostic/pr60862.C
@@ -0,0 +1,10 @@
+// PR c++/60862
+// { dg-do compile }
+
+extern void **bar (int, void *, int);
+
+void
+foo (int x, int y)
+{
+  int **s = bar (x, &x, y); // { dg-error "13:invalid conversion" }
+}
diff --git gcc/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc gcc/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc
index 5a46617..a85ccd8 100644
--- gcc/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc
+++ gcc/libstdc++-v3/testsuite/20_util/bind/ref_neg.cc
@@ -31,9 +31,9 @@ void test01()
   const int dummy = 0;
   std::bind(&inc, _1)(0);               // { dg-error  "no match" }
   // { dg-error "rvalue|const" "" { target *-*-* } 1315 }
-  // { dg-error "rvalue|const" "" { target *-*-* } 1329 }
-  // { dg-error "rvalue|const" "" { target *-*-* } 1343 }
-  // { dg-error "rvalue|const" "" { target *-*-* } 1357 }
+  // { dg-error "rvalue|const" "" { target *-*-* } 1328 }
+  // { dg-error "rvalue|const" "" { target *-*-* } 1342 }
+  // { dg-error "rvalue|const" "" { target *-*-* } 1356 }
   std::bind(&inc, std::ref(dummy))();	// { dg-error  "no match" }
 }
 
	Marek


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]