[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