gm2
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gm2 rejecting a constant statement as variable


From: Gaius Mulley
Subject: Re: gm2 rejecting a constant statement as variable
Date: Sat, 30 Mar 2024 21:51:34 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux)

Alice Osako <alicetrillianosako@gmail.com> writes:

> I am currently intending to work with M2PP (https://github.com/m2sf/m2pp), 
> and for this purpose I have been writing a Makefile to compile all of the
> components and build the preprocessor. I have run the configuration script 
> (using the settings for ISO, GNU, POSIX, 32/64) and started preparing the make
> targets for the individual sub-modules.
>
> However, I have come across a surprising problem: several constant 
> initializations are being flagged as involving one or more variables. I have 
> confirmed
> that the assignments in question are, in fact, constant, but the compiler is 
> saying that they aren't.
>
> For example, the constant declaration:
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>   BitsInUse =
>     ORD(AddressableBits > MaxBits) * MaxBits +
>     ORD(AddressableBits <= MaxBits) * AddressableBits;
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Gives the following error:
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> src/imp/Hash.mod:34:13: error: In implementation module ‘Hash’: in 
> assignment, cannot assign a variable to a constant ‘BitsInUse’
>    34 |   BitsInUse =
>       |             ^
> src/imp/Hash.mod:34:3: error: designator ‘BitsInUse’ is declared as a CONST
>    34 |   BitsInUse =
>       |   ^~~~~~~~~
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> I have confirmed that both AddressableBits and MaxBits are constants, and the 
> application of +, *, and ORD() on constants clearly should be recognized as
> constants as well. Indeed, immediately following this initialization is the 
> constant declaration
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>   TTP16  = ORD(AddressableBits>16) * 65535 + 1;
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> compiles without complaint.

Hi,

> (I am assuming that ORD(FALSE) should return zero, and ORD(TRUE)
> should return one,

correct

> which it clearly is the intended use in this code - in effect, a
> pocket ternary expression that only works with numeric values.)
>

I think this is a compiler error

> I noted that the error message does not specify the supposed variable
> in question, which would make it harder to debug even if there were a
> variable in the assignment.

indeed, I've fixed this locally:

$ gm2 constbool2.mod 
constbool2.mod:8:36: error: In program module ‘constbool2’: the procedure 
function ‘ORD’ is being called from within a constant expression and therefore 
the parameter must be a constant, seen expression
    8 |    BitsInUse = ORD(AddressableBits > MaxBits) * MaxBits + 
ORD(AddressableBits <= MaxBits) * AddressableBits;
      |                    ~~~~~~~~~~~~~~~~^~~~~~~~~

but I've seen this fix needs to be applied to most of the standard
procedure functions.  Once this is done and passes the regression tests
I'll push the git changes

> Am I missing something? I am not inclined to assume that this is a
> compiler fault, but if it isn't, I am not certain why it would see a
> variable in these assignments.

and then move on to the original bug, which is occurring due to the
comparison operator.  The result of the comparison is currently stored
in a variable - which needs to be fixed!

Many thanks for the bug reports - will fix,

regards,
Gaius



reply via email to

[Prev in Thread] Current Thread [Next in Thread]