On Tue, 15 Nov 2022 18:52:41 -0500 Jason Merrill wrote: > 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 > > Cc: Jason Merrill > > --- > > 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. Moved. Ok like attached? Bootstrapped and regtested fine. > > 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))) Well, that would probably work if something would set the location of that template result decl properly, which nothing does out of the box. diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index ed7226b82f0..65d78c82a2d 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -17230,6 +17231,17 @@ start_preparsed_function (tree decl1, tree attrs, int flags) cp_apply_type_quals_to_decl (cp_type_quals (restype), resdecl); } + /* Set the result decl source location to the location of the typespec. */ + if (DECL_RESULT (decl1) + && !DECL_USE_TEMPLATE (decl1) + && DECL_TEMPLATE_INFO (decl1) + && DECL_TI_TEMPLATE (decl1) + && DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (decl1)) + && DECL_RESULT (DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (decl1)))) + DECL_SOURCE_LOCATION (DECL_RESULT (decl1)) + = DECL_SOURCE_LOCATION ( + DECL_RESULT (DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (decl1)))); + /* Record the decl so that the function name is defined. If we already have a decl for this name, and it is a FUNCTION_DECL, use the old decl. */ (gdb) call inform(DECL_SOURCE_LOCATION (DECL_RESULT (decl1)), "decl1 result locus before") ../tmp4/return-narrow-2.cc:7:3: note: decl1 result locus before 7 | { return _M_finish != 0; } | ^ (gdb) n (gdb) call inform(DECL_SOURCE_LOCATION (DECL_RESULT (decl1)), "decl1 result locus from TI") ../tmp4/return-narrow-2.cc:7:3: note: decl1 result locus from TI (gdb) p DECL_SOURCE_LOCATION (DECL_RESULT (decl1)) $1 = 267168 I'm leaving the template case alone for now, maybe i'm motivated later on to again look at grokfndecl and/or grokmethod to fill in the proper location. For starters i only need normal functions. But many thanks for the hint on where the template stuff is, i thought i would not need it at all but had hoped that there is a spot where both declspec are at hand and something is "derived" from the templates. > > > + return ret; > > } > > > > /* Returns true iff an EH_SPEC_BLOCK should be created in the body of >