| /* |
| REQUIRED_ARGS: -preview=dip1000 |
| */ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope3.d(2008): Error: copying `& i` into allocated memory escapes a reference to local variable `i` |
| fail_compilation/retscope3.d(2017): Error: copying `S2000(& i)` into allocated memory escapes a reference to local variable `i` |
| --- |
| */ |
| |
| #line 2000 |
| |
| // https://issues.dlang.org/show_bug.cgi?id=17790 |
| |
| @safe: |
| |
| int* bar1() |
| { |
| int i; |
| int*[] arr = [ &i ]; |
| return arr[0]; |
| } |
| |
| struct S2000 { int* p; } |
| |
| S2000 bar2() |
| { |
| int i; |
| S2000[] arr = [ S2000(&i) ]; |
| return arr[0]; |
| } |
| |
| void bar3(string[] u...) @safe pure nothrow @nogc |
| { |
| foreach (str; u) |
| { |
| } |
| } |
| |
| void bar4() |
| { |
| static struct S { int* p; } |
| S[2][10] pairs; |
| foreach (ref pair; pairs) |
| { |
| } |
| } |
| |
| /**********************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope3.d(4003): Error: copying `u[]` into allocated memory escapes a reference to variadic parameter `u` |
| fail_compilation/retscope3.d(4016): Error: storing reference to outer local variable `i` into allocated memory causes it to escape |
| fail_compilation/retscope3.d(4025): Error: storing reference to stack allocated value returned by `makeSA()` into allocated memory causes it to escape |
| --- |
| */ |
| |
| #line 4000 |
| |
| void bar4000(int[1] u...) @safe |
| { |
| int[][] n = [u[]]; |
| } |
| |
| void bar4001() @safe |
| { |
| static int i; |
| int*[] n = [&i]; |
| } |
| |
| ref int bar4002(return ref int i) @safe |
| { |
| void nested() |
| { |
| int*[] n = [&i]; |
| } |
| return i; |
| } |
| |
| int[3] makeSA() @safe; |
| |
| void bar4003() @safe |
| { |
| int[][] a = [makeSA()[]]; |
| } |