[Issue 14686] New: Postblit isn't sometimes called on concatenation
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Thu Jun 11 21:22:57 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14686
Issue ID: 14686
Summary: Postblit isn't sometimes called on concatenation
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Keywords: CTFE, wrong-code
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: k.hara.pg at gmail.com
Test case:
extern(C) int printf(const char*, ...);
int test()
{
string r;
struct S
{
int n;
this(this)
{
if (!__ctfe) printf("copy n = %d\n", n);
r ~= cast(char)('0' + n);
}
}
S s1 = S(1);
S s2 = S(2);
S[] a1 = [S(1)];
if (!__ctfe) printf("0--\n");
S[2] sa1 = [s1, s2];
if (!__ctfe) printf("1-- %.*s\n", r.length, r.ptr);
assert(r == "12", r); // OK
r = "";
S[] a2 = a1 ~ s2; // runtime concatenation
if (!__ctfe) printf("2-- %.*s\n", r.length, r.ptr);
//assert(r == "12", r); // NG only in CTFE
r = "";
S[2] sa2a = [s1] ~ s2;
if (!__ctfe) printf("3a-- %.*s\n", r.length, r.ptr);
//assert(r == "12", r); // NG, s2 is not copied
r = "";
S[2] sa2b = s2 ~ [s1];
if (!__ctfe) printf("3b-- %.*s\n", r.length, r.ptr);
//assert(r == "21", r); // NG, s2 is not copied
r = "";
S[3] sa3a = ([s1] ~ [s1]) ~ s2;
if (!__ctfe) printf("4a-- %.*s\n", r.length, r.ptr);
//assert(r == "112", r); // NG, s2 is not copied
r = "";
S[3] sa3b = s2 ~ ([s1] ~ [s1]);
if (!__ctfe) printf("4b-- %.*s\n", r.length, r.ptr);
//assert(r == "211", r); // NG, s2 is not copied
return 1;
}
static assert(test()); // CTFE test
void main() { test(); } // runtime test
Output:
$ dmd -run test
0--
copy n = 1
copy n = 2
1-- 12
copy n = 1
copy n = 2
2-- 12
copy n = 1
3a-- 1
copy n = 1
3b-- 1
copy n = 1
copy n = 1
4a-- 11
copy n = 1
copy n = 1
4b-- 11
--
More information about the Digitalmars-d-bugs
mailing list