mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00

This will allow improving functional style code by seamlessly adding `ref` (or `in`) and having the compiler do the job.
51 lines
1.3 KiB
D
51 lines
1.3 KiB
D
/// Test storage class inference on delegate parameters
|
|
|
|
alias FPT = void function (in string, ref string, out string, scope string);
|
|
alias DGT = void delegate (in string, ref string, out string, scope string);
|
|
|
|
void f1 (FPT func)
|
|
{
|
|
string ro = "Hello World";
|
|
string ref_ = ro, out_ = ro;
|
|
func(ro, ref_, out_, ro);
|
|
}
|
|
|
|
void f2 (DGT func)
|
|
{
|
|
string ro = "Hello World";
|
|
string ref_ = ro, out_ = ro;
|
|
func(ro, ref_, out_, ro);
|
|
}
|
|
|
|
void test ()
|
|
{
|
|
f1((in_, ref_, out_, scope_) {
|
|
assert(in_ == "Hello World");
|
|
assert(in_ == scope_);
|
|
assert(in_ == ref_);
|
|
assert(out_ is null);
|
|
});
|
|
|
|
f2((in_, ref_, out_, scope_) {
|
|
assert(in_ == "Hello World");
|
|
assert(in_ == scope_);
|
|
assert(in_ == ref_);
|
|
assert(out_ is null);
|
|
});
|
|
}
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=11316
|
|
void issue11316() {
|
|
void delegate(const int x) F0;
|
|
F0 = (const int x) {}; // OK
|
|
F0 = (x) {}; // OK
|
|
void delegate(in int x) F1;
|
|
F1 = (in int x) {}; // OK
|
|
F1 = (x) {}; // OK
|
|
void delegate(ref int x) F2;
|
|
F2 = (ref int x) {}; // OK
|
|
F2 = (x) {}; // Error
|
|
void delegate(out int x) F3;
|
|
F3 = (out int x) {}; // OK
|
|
F3 = (x) {}; // Error
|
|
}
|