[Issue 17765] void initialisation of out parameters

2022-12-17 Thread d-bugmail--- via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17765

Iain Buclaw  changed:

   What|Removed |Added

   Priority|P1  |P4

--


[Issue 17765] void initialisation of out parameters

2020-06-19 Thread d-bugmail--- via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17765

--- Comment #3 from Илья Ярошенко  ---
related issue https://issues.dlang.org/show_bug.cgi?id=20957

--


[Issue 17765] void initialisation of out parameters

2020-06-19 Thread d-bugmail--- via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17765

Илья Ярошенко  changed:

   What|Removed |Added

 CC||ilyayaroshe...@gmail.com
   Hardware|x86 |All
 OS|Mac OS X|All

--


[Issue 17765] void initialisation of out parameters

2017-08-21 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17765

--- Comment #2 from Nicholas Wilson  ---
Yeah the compiler was not able to determine that all values were assigned
despite there being no conditional logic for the initialisation:

foreach(i; 0 .. M-1)
{
corr[i][i] = 1.0;
for (auto j = i+1; j < M; j++)
{
corr[i][j] = 0.0;
for (auto k = 0; k < N; k++)
corr[i][j] += data[k][i] * data[k][j];
corr[j][i] = corr[i][j];
}
}
foreach(i; 0 .. M) corr[M-1][i] = 0.0;
corr[M-1][M-1] = 1.0;

>I was wondering if this could more of an implementation detail in the function 
>itself.
>
> i.e.:
>
> void g(out float[M][M] corr)
> {
> corr = void; // disables the initial write
> }

That would also work and would probably be less effort in the compiler and less
confusing.

> This shouldn't be allowed in @safe code.

Definitely.

--


[Issue 17765] void initialisation of out parameters

2017-08-21 Thread via Digitalmars-d-bugs
https://issues.dlang.org/show_bug.cgi?id=17765

Steven Schveighoffer  changed:

   What|Removed |Added

 CC||schvei...@yahoo.com

--- Comment #1 from Steven Schveighoffer  ---
In the case of out variables, one of the reasons the init is done is to ensure
that the data is all written to.

2 things:

1. If the compiler can prove that the out variable is completely written in all
paths, then the initial write can be removed (could be happening already).
2. If the out = void syntax is accepted, and not all the data is written, then
this should really be an error.

Both require advanced flow analysis, and may not be possible in all cases, so
the result is that in cases where =void is used, not writing all the data is
going to be UB.

Another issue is that the current grammar/syntax defines =X to mean "pass X as
parameter if none specified". =void looks weird, and it also doesn't fit the
grammar if you have required parameters after it.

I was wondering if this could more of an implementation detail in the function
itself.

i.e.:

void g(out float[M][M] corr)
{
corr = void; // disables the initial write
}

This shouldn't be allowed in @safe code.

--