[Issue 21197] New: Wrong lifetime inference with DIP1000 in dmd 2.093.0
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Aug 25 14:26:37 UTC 2020
https://issues.dlang.org/show_bug.cgi?id=21197
Issue ID: 21197
Summary: Wrong lifetime inference with DIP1000 in dmd 2.093.0
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: atila.neves at gmail.com
This is a regression compared to 2.092.1. I don't know how this got past CI
since it broke unit-threaded.
This test compiled with 2.092.1 but fails to do so with 2.092.1:
https://github.com/atilaneves/unit-threaded/blob/42d517a9bbdfc216fcedf65440c1ec71b437a175/tests/unit_threaded/ut/property.d#L7
The reason is the @safe inference done on this template function:
https://github.com/atilaneves/unit-threaded/blob/42d517a9bbdfc216fcedf65440c1ec71b437a175/subpackages/property/source/unit_threaded/property.d#L21
After investigating and adding @safe to it, the compiler fails to compile it
with this:
subpackages/property/source/unit_threaded/property.d(48,21): Error: address of
struct temporary returned by createGenerator() assigned to longer lived
variable gen
This is obviously false. Applying this diff makes the problem go away, which is
a valid workaround but that shouldn't be needed:
// See https://github.com/atilaneves/unit-threaded/issues/187 for why
- auto createGenerator() {
+ auto createGenerator(ref Random random) {
return RndValueGen!(Parameters!F)(&random);
}
// It might be that some projects don't use dip1000 and so
// createGenerator isn't safe
static if(isSafe!createGenerator)
- scope gen = createGenerator;
+ scope gen = createGenerator(random);
else
- scope gen = () @trusted { return createGenerator; }();
+ scope gen = () @trusted { return createGenerator(random); }();
auto input(Flag!"shrink" shrink = Yes.shrink) {
--
More information about the Digitalmars-d-bugs
mailing list