This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Improve location of CALL_EXPRs (PR c++/60862)
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jason Merrill <jason at redhat dot com>
- Date: Fri, 12 Sep 2014 22:52:02 +0200
- Subject: [C++ PATCH] Improve location of CALL_EXPRs (PR c++/60862)
- Authentication-results: sourceware.org; auth=none
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