On 11/12/22 13:45, Bernhard Reutner-Fischer wrote:
gcc/cp/ChangeLog:
* decl.cc (start_function): Set the result decl source location to
the location of the typespec.
---
Bootstrapped and regtested on x86_86-unknown-linux with no regressions.
Ok for trunk?
Cc: Nathan Sidwell <nat...@acm.org>
Cc: Jason Merrill <ja...@redhat.com>
---
gcc/cp/decl.cc | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 6e98ea35a39..ed40815e645 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -17449,6 +17449,8 @@ start_function (cp_decl_specifier_seq *declspecs,
tree attrs)
{
tree decl1;
+ tree result;
+ bool ret;
We now prefer to declare new variables as late as possible, usually when
they are initialized.
decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, &attrs);
invoke_plugin_callbacks (PLUGIN_START_PARSE_FUNCTION, decl1);
@@ -17461,7 +17463,18 @@ start_function (cp_decl_specifier_seq *declspecs,
gcc_assert (same_type_p (TREE_TYPE (TREE_TYPE (decl1)),
integer_type_node));
- return start_preparsed_function (decl1, attrs, /*flags=*/SF_DEFAULT);
+ ret = start_preparsed_function (decl1, attrs, /*flags=*/SF_DEFAULT);
+
+ /* decl1 might be ggc_freed here. */
+ decl1 = current_function_decl;
+
+ /* Set the result decl source location to the location of the typespec. */
+ if (TREE_CODE (decl1) == FUNCTION_DECL
+ && declspecs->locations[ds_type_spec] != UNKNOWN_LOCATION
+ && (result = DECL_RESULT (decl1)) != NULL_TREE
+ && DECL_SOURCE_LOCATION (result) == input_location)
+ DECL_SOURCE_LOCATION (result) = declspecs->locations[ds_type_spec];
One way to handle the template case would be for the code in
start_preparsed_function that sets DECL_RESULT to check whether decl1 is
a template instantiation, and in that case copy the location from the
template's DECL_RESULT, i.e.
DECL_RESULT (DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (decl1)))
+ return ret;
}
/* Returns true iff an EH_SPEC_BLOCK should be created in the body of