dmd/compiler/test/compilable/infer_stc.d
Geod24 947de21c62 Fix 11316: Infer storage class of parameters with function literals
This will allow improving functional style code by seamlessly
adding `ref` (or `in`) and having the compiler do the job.
2023-02-28 12:49:16 +08:00

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
}