What is done at compile time

Now obviously

param zero = 0:real(32);
param z = 0.0:real(32);

has no run-time overhead.
But does

const zero = 0:real(32);
const z = 0.0:real(32);

have any runtime overhead, i.e. does the former try and convert integral 0 to a 32-bit floating point number, or the latter try and convert 64-bit floating point to a 32-bit floating point.

What about when either 0:real(32) or 0.0:real(32) appear in an expression. Is the compiler smart enough to do those conversions at compile time?

Yes, 0:real(32) and 0.0:real(32) are both expressions that are param values (ie. exist at compile time). It does not matter where the expression appears -- the expression itself is param.

These values become non-param only when stored in a non-param variable or argument. E.g., var x = 0:real(32); or proc f(arg: real(32)) { } f(0:real(32)).

Wonderful. Another case where Chapel is superior to C.

Thanks Michael.