| error: conflicting function declarations "insert_c"
| old definition in module ask file insert.h line 22
| void (signed int, signed int)
| new definition in module insert file insert.c line 207
| void (char c, signed int n)
| Makefile:298: recipe for target 'jjove' failed

I think that the compiler is wrong.

The definition of insert_c uses the old-style parameter declarations
(from before prototypes were introduced to C).  Jove predates
prototypes and we aspire to support very old systems.  We do like
prototypes so Jove will use them on systems that support them.

This requires us to use old-style function definitions but with
corresponding prototyped declarations for those functions.

When using that old style of function definition, the parameters are
subject to "default argument promotion" rules.  So, for example, a
parameter declaration of "char c" becomes "int c" in the corresponding
prototype.

The declaration of insert_c in insert.h uses a prototype that types c
as DAPchar, a macro that stands for DefaultArgPromotionOf_char.  In
other words, int.

So: Jove's source very carefully follows the C standard on this
matter.  Although I don't remember if this was changed in any way by
the latest edition.  If there were a change, surely it would be to
drop old-style definitions, but that isn't what the diagnostic is
saying.

Caveat: it is legal but rare for int and char to be the same width
and for char to be unsigned.  On such systems, the Default Arg
Promotion of char would be unsigned int.

Reply via email to