summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gdc.test/fail_compilation/fail19038.d
blob: ef1a8b767e5b9a1e450aada5c1541469a9f5056d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* TEST_OUTPUT:
---
fail_compilation/fail19038.d(21): Error: cannot implicitly convert expression `a` of type `string[][]` to `const(string)[][]`
fail_compilation/fail19038.d(23): Error: cannot modify `const` expression `c[0]`
---
 * Credit: yshui
 * https://github.com/dlang/dmd/pull/8413#issuecomment-401104961
 * https://issues.dlang.org/show_bug.cgi?id=19038
 */


void test()
{
    /* string[][] is not implicitly converible to const(string)[][],
     * and there is good reason why:
     *
     * https://stackoverflow.com/questions/5055655/double-pointer-const-correctness-warnings-in-c
     */

    string[][] a = [["Lord"]];
    const(string)[][] b = a; // assume this works (and it should not)
    const(string)[] c = ["Sauron"];
    c[0] = "Mordor"; // invalid, because c[0] is const(string)

    b[0] = c; // valid, b[0] is const(string)[]
    // But now, a[0] has become c
    a[0][0] = "Nazgul"; // valid, because a[0][0] is string
    // But this also changes c[0], which shouldn't be possible
}