On Thu, May 25, 2017 at 03:02:42PM +0100, Jonathan Wakely wrote: > On 25/05/17 11:07 +0100, Jonathan Wakely wrote: > > On 25/05/17 10:05 +0200, Andreas Schwab wrote: > > > ../../gcc/ada/gcc-interface/utils2.c: In function 'int > > > compare_elmt_bitpos(const void*, const void*)': > > > ../../gcc/ada/gcc-interface/utils2.c:1937:73: error: type qualifiers > > > ignored on cast result type [-Werror=ignored-qualifiers] > > > const constructor_elt * const elmt1 = (const constructor_elt * const) > > > rt1; > > > ^~~ > > > ../../gcc/ada/gcc-interface/utils2.c:1938:73: error: type qualifiers > > > ignored on cast result type [-Werror=ignored-qualifiers] > > > const constructor_elt * const elmt2 = (const constructor_elt * const) > > > rt2; > > > > I'm testing this obvious fix. > > Committed as r248458 because it gets bootstrap past the error above, > although now Ada fails for me with: > > /home/jwakely/src/gcc/bootstrap/./gcc/xgcc > -B/home/jwakely/src/gcc/bootstrap/./gcc/ > -B/usr/local/x86_64-pc-linux-gnu/bin/ -B/usr/local/x86_64-pc-linux-gnu/lib/ > -isystem /usr/local/x86_64-pc-linux-gnu/include -isystem > /usr/local/x86_64-pc-linux-gnu/sys-include -c -g -O2 -m32 -fpic -W -Wall > -gnatpg -nostdinc -m32 s-regpat.adb -o s-regpat.o > > raised STORAGE_ERROR : stack overflow or erroneous memory access > ../gcc-interface/Makefile:296: recipe for target 's-regpat.o' failed > > > > diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c > > index fc6f1b8..cd37791 100644 > > --- a/gcc/ada/gcc-interface/utils2.c > > +++ b/gcc/ada/gcc-interface/utils2.c > > @@ -1934,8 +1934,8 @@ build_call_raise_range (int msg, Node_Id gnat_node, > > char kind, > > static int > > compare_elmt_bitpos (const PTR rt1, const PTR rt2) > > { > > - const constructor_elt * const elmt1 = (const constructor_elt * const) > > rt1; > > - const constructor_elt * const elmt2 = (const constructor_elt * const) > > rt2; > > + const constructor_elt * const elmt1 = (const constructor_elt *) rt1; > > + const constructor_elt * const elmt2 = (const constructor_elt *) rt2; > > const_tree const field1 = elmt1->index; > > const_tree const field2 = elmt2->index; > > const int ret
So, what can one do with typeof or similar to avoid the warning? void foo (const void *p) { const int *const q = (const int *const) p; typeof (q) r = (typeof (q)) p; (void) q; (void) r; } AFAIK typeof doesn't strip the toplevel qualifiers and I see current trunk warns even about the cast in r initialization. Similarly to what has been noted recently in another (C) PR, it would be nice if we had toplevel cv stripping variant of typeof or some special builtin that could wrap typeof or some type and could be used in places where typeof can, __strip_cv (typeof (q)) = (__strip_cv (typeof (q))) p; or typeof (q) = (__strip_cv (typeof (q))) p; or __strip_cv (const int *const) z; where the last one would be effectively const int *z; Jakub