C++: missing result_decl loc of (member) functions
Bernhard Reutner-Fischer
rep.dot.nop@gmail.com
Wed Apr 20 17:20:24 GMT 2022
Hi!
I'm having a hard time to set the correct location of the result decl of
member functions in C++. Any hint on where to best fix the missing
locus?
TIA for any hint (or a fix :).
Long version:
Neither the C nor the C++ frontend seem to have a working/proper
location for the RESULT_DECL of functions. This makes it impossible to
have diagnostics point at the return type of a function and hence it is
impossible to have fixit-replace hints for the return types. [There is
a gfortran bug that asks to use narrower return types for functions
in the FE and i meant to get me a C++ warning that would point out all
affected spots in the fortran FE..]
Adding the correct location to the result decl of a function in the C
frontend was easy, see attached. Same for the C++ FE for normal
functions. These are covered in the attached sample-testcase
return-narrow.cc ¹) and work well. I'm attaching a single patch for the
C and C++ FE, knowing that they are to be sent separately upon
real submission and probably only once stage1 reopens.
But i cannot seem to find a proper spot to handle member functions (if
that's the correct term for them).
These are preparsed functions AFAICS and i'd need a place where i can
get at the declspecs[ds_type_spec] and the function is parsed "enough"
that the return type is determined, i think.
I'm attaching the sample-testcase return-narrow-2.cc which, with a
pristine compiler, gives no location for the result decl at all:
---8<---
$ XXX=1 ../gcc/xg++ -B../gcc -c -o return-narrow.o return-narrow-2.cc -fdiagnostics-color=always
return-narrow-2.cc: In member function ‘long unsigned int __mini_vector< <template-parameter-1-1> >::_M_space_left()’:
return-narrow-2.cc:7:3: warning: result decl locus sample
7 | { return _M_finish != 0; }
| ^
| the return type
return-narrow-2.cc: In instantiation of ‘long unsigned int __mini_vector< <template-parameter-1-1> >::_M_space_left() [with <template-parameter-1-1> = std::pair<long int, long int>]’:
return-narrow-2.cc:9:17: required from here
return-narrow-2.cc:6:3: warning: result decl locus sample
6 | _M_space_left()
| ^~~~~~~~~~~~~
| the return type
return-narrow-2.cc: In instantiation of ‘long unsigned int __mini_vector< <template-parameter-1-1> >::_M_space_left() [with <template-parameter-1-1> = int]’:
return-narrow-2.cc:10:17: required from here
return-narrow-2.cc:6:3: warning: result decl locus sample
6 | _M_space_left()
| ^~~~~~~~~~~~~
| the return type
---8<---
I'd like to have the result_decl of _M_space_left point to the
type unsigned long on line 5, which i think would be the correct type
of that memberfn:
1 namespace std { template < typename, typename > struct pair; }
2 template < typename > struct __mini_vector
3 {
4 int _M_finish;
5 unsigned long
6 _M_space_left()
7 { return _M_finish != 0; }
8 };
9 template class __mini_vector< std::pair< long, long > >;
10 template class __mini_vector< int >;
help? :) TIA!
¹) C functions work out fine once fixed to have the correct loc.
C++ functions worked fine once, but i now see that apparently
"int my_main" on line 42 regressed again in the meantime:
$ XXX=1 ../gcc/xg++ -B../gcc -c -o return-narrow.o return-narrow.cc -fdiagnostics-color=always
return-narrow.cc: In function ‘int xyz(int, int, int)’:
return-narrow.cc:1:1: warning: result decl locus sample
1 | int xyz (int param1, int param2, int param3)
| ^~~
| the return type
return-narrow.cc: In function ‘int abc(int, int, int)’:
return-narrow.cc:11:1: warning: result decl locus sample
11 | int abc (int param1, int param2, int param3)
| ^~~
| the return type
return-narrow.cc: In function ‘const void* const* pointer_thingie(void*)’:
return-narrow.cc:21:7: warning: result decl locus sample
21 | const void *const * pointer_thingie (void *i)
| ^~~~
| the return type
return-narrow.cc: In function ‘int comparer(int, int, int)’:
return-narrow.cc:25:1: warning: result decl locus sample
25 | int comparer (int param1, int param2, int param3)
| ^~~
| the return type
return-narrow.cc: In function ‘int main()’:
return-narrow.cc:35:1: warning: result decl locus sample
35 | int main (void) // dg-bogus "Function .main. could return .bool."
| ^~~
| the return type
return-narrow.cc: In function ‘int my_main(int, char**)’:
return-narrow.cc:42:25: warning: result decl locus sample
42 | int my_main (int, char**) { return 0; }
| ^
| the return type
return-narrow.cc: In function ‘int hidden_main(int, char**)’:
return-narrow.cc:43:1: warning: result decl locus sample
43 | int hidden_main (int, char**) { return 1; }
| ^~~
| the return type
return-narrow.cc: In function ‘int i64c(int)’:
return-narrow.cc:46:1: warning: result decl locus sample
46 | int i64c(int i)
| ^~~
| the return type
-------------- next part --------------
A non-text attachment was scrubbed...
Name: result_decl_loc.00.patch
Type: text/x-patch
Size: 3692 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-help/attachments/20220420/b1692165/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: return-narrow.cc
Type: text/x-c++src
Size: 1058 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-help/attachments/20220420/b1692165/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: return-narrow-2.cc
Type: text/x-c++src
Size: 287 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-help/attachments/20220420/b1692165/attachment-0002.bin>
More information about the Gcc-help
mailing list