[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