| /* |
| REQUIRED_ARGS: -dip1000 |
| PERMUTE_ARGS: |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(102): Error: scope variable `s` assigned to `p` with longer lifetime |
| fail_compilation/retscope2.d(107): Error: address of variable `s` assigned to `p` with longer lifetime |
| --- |
| */ |
| |
| #line 100 |
| @safe foo1(ref char[] p, scope char[] s) |
| { |
| p = s; |
| } |
| |
| @safe bar1(ref char* p, char s) |
| { |
| p = &s; |
| } |
| |
| /**********************************************/ |
| |
| // https://issues.dlang.org/show_bug.cgi?id=17123 |
| |
| void test200() |
| { |
| char[256] buffer; |
| |
| char[] delegate() read = () { |
| return buffer[]; |
| }; |
| } |
| |
| /**********************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(302): Error: scope variable `a` assigned to return scope `b` |
| --- |
| */ |
| |
| #line 300 |
| @safe int* test300(scope int* a, return scope int* b) |
| { |
| b = a; |
| return b; |
| } |
| |
| /**********************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(403): Error: scope variable `a` assigned to return scope `c` |
| --- |
| */ |
| |
| #line 400 |
| @safe int* test400(scope int* a, return scope int* b) |
| { |
| auto c = b; // infers 'return scope' for 'c' |
| c = a; |
| return c; |
| } |
| |
| /**********************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(504): Error: scope variable `c` may not be returned |
| --- |
| */ |
| |
| #line 500 |
| @safe int* test500(scope int* a, return scope int* b) |
| { |
| scope c = b; // does not infer 'return' for 'c' |
| c = a; |
| return c; |
| } |
| |
| /**********************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(604): Error: scope variable `_param_0` assigned to non-scope parameter `unnamed` calling retscope2.foo600 |
| fail_compilation/retscope2.d(604): Error: scope variable `_param_1` assigned to non-scope parameter `unnamed` calling retscope2.foo600 |
| fail_compilation/retscope2.d(614): Error: template instance retscope2.test600!(int*, int*) error instantiating |
| --- |
| */ |
| |
| #line 600 |
| @safe test600(A...)(scope A args) |
| { |
| foreach (i, Arg; A) |
| { |
| foo600(args[i]); |
| } |
| } |
| |
| @safe void foo600(int*); |
| |
| @safe bar600() |
| { |
| scope int* p; |
| scope int* q; |
| test600(p, q); |
| } |
| |
| /*************************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(719): Error: returning `get2(s)` escapes a reference to local variable `s` |
| fail_compilation/retscope2.d(721): Error: returning `s.get1()` escapes a reference to local variable `s` |
| --- |
| */ |
| |
| #line 700 |
| // https://issues.dlang.org/show_bug.cgi?id=17049 |
| |
| @safe S700* get2(return ref scope S700 _this) |
| { |
| return &_this; |
| } |
| |
| struct S700 |
| { |
| @safe S700* get1() return scope |
| { |
| return &this; |
| } |
| } |
| |
| S700* escape700(int i) @safe |
| { |
| S700 s; |
| if (i) |
| return s.get2(); // 719 |
| else |
| return s.get1(); // 721 |
| } |
| |
| /*************************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(804): Error: scope variable `e` may not be thrown |
| --- |
| */ |
| |
| #line 800 |
| |
| void foo800() |
| { |
| scope Exception e; |
| throw e; |
| } |
| |
| /*************************************************/ |
| /+ |
| /* |
| XEST_OUTPUT: |
| |
| fail_compilation/retscope2.d(907): Error: address of variable `this` assigned to `p17568` with longer lifetime |
| |
| */ |
| |
| #line 900 |
| |
| int* p17568; |
| struct T17568 |
| { |
| int a; |
| void escape() @safe scope |
| { |
| p17568 = &a; |
| } |
| } |
| +/ |
| /*************************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(1005): Error: scope variable `p` assigned to `this` with longer lifetime |
| fail_compilation/retscope2.d(1024): Error: scope variable `p` assigned to `d` with longer lifetime |
| --- |
| */ |
| |
| #line 1000 |
| |
| class C17428 |
| { |
| void set(scope int* p) @safe |
| { |
| _p = p; |
| } |
| |
| int* _p; |
| } |
| |
| class C17428b |
| { |
| int* _p; |
| } |
| |
| void test17428() @safe |
| { |
| int x; |
| int* p = &x; |
| scope C17428b c; |
| c._p = p; // ok |
| |
| C17428b d; |
| d._p = p; // bad |
| } |
| |
| |
| |
| /*************************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(1107): Error: scope variable `dg` may not be returned |
| --- |
| */ |
| |
| #line 1100 |
| |
| struct S17430 { void foo() {} } |
| |
| void delegate() test17430() @safe |
| { |
| S17430 s; |
| auto dg = &s.foo; // infer dg as scope |
| return dg; |
| } |
| |
| /****************************************************/ |
| |
| /* |
| TEST_OUTPUT: |
| --- |
| fail_compilation/retscope2.d(1216): Error: returning `s.foo()` escapes a reference to local variable `s` |
| fail_compilation/retscope2.d(1233): Error: returning `t.foo()` escapes a reference to local variable `t` |
| --- |
| */ |
| |
| #line 1200 |
| // https://issues.dlang.org/show_bug.cgi?id=17388 |
| |
| struct S17388 |
| { |
| //int* |
| auto |
| foo() return @safe |
| { |
| return &x; |
| } |
| int x; |
| } |
| |
| @safe int* f17388() |
| { |
| S17388 s; |
| return s.foo(); |
| } |
| |
| struct T17388 |
| { |
| //int[] |
| auto |
| foo() return @safe |
| { |
| return x[]; |
| } |
| int[4] x; |
| } |
| |
| @safe int[] g17388() |
| { |
| T17388 t; |
| return t.foo(); |
| } |
| |
| |
| |