This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR c++/80544 strip cv-quals from cast results
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jonathan Wakely <jwakely at redhat dot com>
- Cc: Andreas Schwab <schwab at linux-m68k dot org>, Jason Merrill <jason at redhat dot com>, gcc-patches List <gcc-patches at gcc dot gnu dot org>, Nathan Sidwell <nathan at acm dot org>
- Date: Thu, 25 May 2017 16:11:19 +0200
- Subject: Re: [PATCH] PR c++/80544 strip cv-quals from cast results
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jakub at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 51C0ABDD4
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 51C0ABDD4
- References: <20170427165907.GL5109@redhat.com> <CADzB+2nMhFnDrqk1jbE3nDx7b1hukJuWB3J5pSt=dGXmceOVPA@mail.gmail.com> <20170523180046.GG12306@redhat.com> <CADzB+2=yocABQpVueGU4rTwLbTwn1f8wkT2FEUC4ZS0=Ai+oig@mail.gmail.com> <20170524142022.GJ12306@redhat.com> <m2inkp744p.fsf@linux-m68k.org> <20170525100700.GU12306@redhat.com> <20170525140242.GA12306@redhat.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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