Float[] * Real is a Float[]?
    Jab 
    jab_293 at gmall.com
       
    Wed Dec 11 06:27:35 UTC 2019
    
    
  
On Tuesday, 10 December 2019 at 20:47:16 UTC, kinke wrote:
> On Tuesday, 10 December 2019 at 20:35:26 UTC, Ali Çehreli wrote:
>> On 12/10/19 11:26 AM, Adam D. Ruppe wrote:
>>> On Tuesday, 10 December 2019 at 19:22:01 UTC, Jonathan Levi 
>>> wrote:
>>>> Why does this not work?
>>> 
>>> The [] operators work in place. It doesn't create a new 
>>> array, just multiplies the existing elements.
>>
>> Then the a[]*r syntax should not be allowed. We should be 
>> forced to write
>>
>>  a[] *= r;
>>
>> No?
>
> No, because the statement is not correct:
>
> void main()
> {
>     float[3] a = [10,2,4];
>     real b = 5.5;
>     float[3] c = a[] * b;
>     assert(a[0] == 10); // fine, `a` is untouched
> }
>
> The actual reason can be seen by inspecting the lowered AST 
> (-vcg-ast):
>
> float[3] c = arrayOp(c[], a[], cast(float)b);
>
> or alternatively, by inspecting the LLVM IR produced by LDC, or 
> the assembly:
>
> pure nothrow @nogc @trusted float[] 
> core.internal.arrayop.arrayOp!(float[], float[], float, "*", 
> "=").arrayOp(float[], float[], float)
>
> I.e., the array-op is in single precision and the scalar rhs b 
> is cast to a float.
Still doesn't really make sense. The compiler is explicitly 
giving those types, it seems to be a bug.
typeof(float * real) == real
That shouldn't be different for arrays, if it should be different 
for an array then you should have to explicitly cast the real to 
float.
    
    
More information about the Digitalmars-d
mailing list