[m-users.] C compiler error

Zoltan Somogyi zoltan.somogyi at runbox.com
Tue Feb 28 04:13:59 AEDT 2023



On Mon, 27 Feb 2023 18:05:09 +0100, Volker Wysk <post at volker-wysk.de> wrote:
> I've taken a look at the mq.c file. There, mq_module0, mq_module1 and so on
> are automatically generated C functions. And their storage class is invalid.
> So this would be a Mercury compiler bug.

Only if you consider the Mercury compiler's inability to automatically fix
a bug in user-provided C code to be a bug in the Mercury compiler :-(

> Am Montag, dem 27.02.2023 um 15:49 +0100 schrieb Volker Wysk:
> > Hi.
> > 
> > I have a Mercury module with a lot of foreign C code, and I get many
> > compiler errors like this:
> > 
> > Making Mercury/os/mq.o
> > Mercury/cs/mq.c: In function ‘null_to_empty’:
> > Mercury/cs/mq.c:644:1: error: invalid storage class for function
> > ‘mq_module0’
> > Mercury/cs/mq.c:644:1: error: invalid storage class for function
> > ‘mq_module0’
> > Mercury/cs/mq.c:764:1: error: invalid storage class for function
> > ‘mq_module1’
> > Mercury/cs/mq.c:764:1: error: invalid storage class for function
> > ‘mq_module1’
> > ...
> > 
> > 
> > 
> > The function in question is this:
> > 
> > :- pragma foreign_code("C",
> > "
> >   char * null_to_empty(char * str)
> >   {
> >     if (str == 0) {
> >        MR_String str1 = MR_GC_malloc(1);
> >        *str1 = (char) 0;
> >        return str1;
> >     } else {
> >        return str;
> >     }
> > ").

The bug is in your code: the left brace that starts the C function
has no matching right brace. The C compiler complains about
the following C functions because it thinks that they are being
declared INSIDE the null_to_empty function.

In the future, when reporting a possible problem with an error message
that mentions some definitions (mq_module0 and mq_module1),
it would help if you included the CODE OF THOSE DEFINITIONS,
and not the definition of something unrelated, such as null_to_empty.

Zoltan.





More information about the users mailing list