[M3devel] [modula3/cm3] Packed set literal generation issue (#21)
Rodney M. Bates
rodney_bates at lcwb.coop
Sat Sep 23 17:59:37 CEST 2017
The following didn't come through the first time, at least not to me:
Fixed on github, commit 12f50b4cde746056b943bd8aaa105c3fcb46b1a8
Deleted the assertion, which is neither true nor needed.
But see below:
On 09/16/2017 11:54 PM, jcchu wrote:
> See the fragment below.
>
> VAR r := SET OF [0..31] { 0 }; (* OK *)
> s := BITS 32 FOR SET OF [0..31] { 0 }; (* -- assertion failure in “SetExpr.m3” *)
Are you aware that the BITS 32 here has no effect on the size of the global variable?
Quoting from 2.2.5, Packed types:
TYPE T = BITS n FOR Base
where Base is a type and n is an integer-valued constant expression.
The values of type T are the same as the values of type Base, but variables of type T
that occur in records, objects, or arrays
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
will occupy exactly n bits and be packed adjacent to the preceding field or element.
s is not inside a record, object, or array, so the BITS specification has no effect on
the memory allocated by the compiler.
There are, however some more obscure differences:
1) Although T and BITS n FOR T are are assignable to each other,
BITS n FOR T and BITS m FOR T, (n#m) have no subtype or assignability
relationship, so to assign one to the other would require two assignment
steps, with a T as the intermediate type.
2) Anywhere type equality, as opposed to assignability, is required, T and
BITS n FOR T will not match. For example, you cannot pass one of these to
the other as a VAR parameter.
--
Rodney Bates
rodney.m.bates at acm.org
More information about the M3devel
mailing list