* Eduardo Habkost (ehabk...@redhat.com) wrote:
> On Thu, Jun 15, 2017 at 01:14:15PM +0100, Dr. David Alan Gilbert wrote:
> > * Eduardo Habkost (ehabk...@redhat.com) wrote:
> > > This is being included in the RFC just to help validating the series,
> > > and ensure we don't use NULL errp anywhere.
> > > 
> > > I don't propose we actually change all code to use the
> > > 'Error *errp[static 1]' syntax because it confuses Cocinelle.
> > > 
> > > I am considering including a assert(errp) line in the ERR_IS_SET()
> > > macro, so we can catch NULL errp at runtime in case somebody forgets
> > > about it.
> > > 
> > > Generated by the following Coccinelle patch:
> > > 
> > >   @@
> > >   typedef Error;
> > >   type T;
> > >   identifier FN !~ "os_mem_prealloc|qemu_fork";
> > >   identifier errp;
> > >   @@
> > >    T FN(...,
> > >   -     Error **errp
> > >   +     Error *errp[STATIC_1]
> > >        );
> > > 
> > >   @@
> > >   typedef Error;
> > >   type T;
> > >   identifier FN !~ "os_mem_prealloc|qemu_fork";
> > >   identifier errp;
> > >   @@
> > >    T FN(...,
> > >   -     Error **errp
> > >   +     Error *errp[STATIC_1]
> > >        ) { ... }
> > > 
> > > Followed by the following sed command:
> > > 
> > >   $ sed -i -e 's/\[STATIC_1\]/[static 1]/g' $(g grep -w -l STATIC_1)
> > > 
> > > Signed-off-by: Eduardo Habkost <ehabk...@redhat.com>
> > > ---
> > 
> > <snip>
> > 
> > >  void visit_start_struct(Visitor *v, const char *name, void **obj,
> > > -                        size_t size, Error **errp);
> > > +                        size_t size, Error *errp[static 1]);
> > >  
> > 
> > Is it possible to typedef that to something that hides the magic syntax?
> > Then we could get that down to QError errp   or something like that?
> 
> Unfortunately it is not possible to hide it in a typedef: the
> "static" keyword inside the square brackets is a feature of
> function parameter declarations only.  Using it on a typedef
> results in:
> 
> a.c:3:16: error: static or type qualifiers in non-parameter array declarator
>  typedef Error *ErrorPtr[static 1];

That's a shame; it's rather odd looking; still I think it's
worth it if it simplifies the error code.

> We could use a preprocessor macro, but I suspect this would also
> confuse Coccinelle.
> 
> -- 
> Eduardo

Dave
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK

Reply via email to