Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2225965/?format=api
{ "id": 2225965, "url": "http://patchwork.ozlabs.org/api/patches/2225965/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/20260421215426.938092-1-ibuclaw@gdcproject.org/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260421215426.938092-1-ibuclaw@gdcproject.org>", "list_archive_url": null, "date": "2026-04-21T21:54:26", "name": "[committed] d: Merge upstream dmd, druntime d1fbbb1a2f", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "fe6155770882e418fa3c0b5085c66b76c91b1dbe", "submitter": { "id": 46728, "url": "http://patchwork.ozlabs.org/api/people/46728/?format=api", "name": "Iain Buclaw", "email": "ibuclaw@gdcproject.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/20260421215426.938092-1-ibuclaw@gdcproject.org/mbox/", "series": [ { "id": 500899, "url": "http://patchwork.ozlabs.org/api/series/500899/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=500899", "date": "2026-04-21T21:54:26", "name": "[committed] d: Merge upstream dmd, druntime d1fbbb1a2f", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/500899/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2225965/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2225965/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gdcproject.org header.i=@gdcproject.org\n header.a=rsa-sha256 header.s=MBO0001 header.b=NskdYkU/;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gdcproject.org header.i=@gdcproject.org\n header.a=rsa-sha256 header.s=MBO0001 header.b=NskdYkU/", "sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=gdcproject.org", "sourceware.org; spf=pass smtp.mailfrom=gdcproject.org", "server2.sourceware.org;\n arc=none smtp.remote-ip=80.241.56.172" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0bkR3CF7z1yGs\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 07:55:10 +1000 (AEST)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 1DA694BA9024\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Apr 2026 21:55:08 +0000 (GMT)", "from mout-p-202.mailbox.org (mout-p-202.mailbox.org [80.241.56.172])\n by sourceware.org (Postfix) with ESMTPS id 100464BA23FC\n for <gcc-patches@gcc.gnu.org>; Tue, 21 Apr 2026 21:54:34 +0000 (GMT)", "from smtp102.mailbox.org (smtp102.mailbox.org [10.196.197.102])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mout-p-202.mailbox.org (Postfix) with ESMTPS id 4g0bjf4VnDz9t9S;\n Tue, 21 Apr 2026 23:54:30 +0200 (CEST)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 1DA694BA9024", "OpenDKIM Filter v2.11.0 sourceware.org 100464BA23FC" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 100464BA23FC", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 100464BA23FC", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776808474; cv=none;\n b=ETSyMWCBeAFAMX6JEQuv/iSrnFkNdTwsKooSDYp7Kipz3bWgHdrB8dV/UQzwpGppY/98An1Xbt9JmnxuNJ8FZM7zEkQJ3HnSLxTEEBF9Bkyoy3Sv32kvzrvkPGRdhwdJZuZ0OQESg8Xy96D9ox/pIvYJUcvUOc9c+2TcTG2CqyU=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776808474; c=relaxed/simple;\n bh=dGWkz3JN5kBO1iD06p/WsT+lZvDw/TV2V5tie8CrXu4=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=Z1bw2LkYthj0Ly24YywwQaqwZ0+BT/ddeCY1WcQgyXSNlhXI8RMl0sJhSFfvTOzhGtDBt19yFd6BomEOh/fnd0CETPA6wHO3IOdFYzkpTQXZb5CAdbPINppVpGEOeW1Gt/fRb6QJYKXkRIx3zq0xQcTXL4vaItF3LOe5ox1t0x0=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gdcproject.org;\n s=MBO0001; t=1776808470;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding;\n bh=MnZ7QRz5L1ya1RTXoGZm4yfe8XRS4gLzgO2rYj65/N4=;\n b=NskdYkU/tcDtfpBdj2h7yWxzAopwMvcszekzrPk/omWU7pSZIqR3aax36BXFF/DHUV/QxW\n SsZUOpWwGlGWFT/6+lCCFgB5/pKL/WXeQJ3ZaeyFEBi2yrxlCEcoIJwovvsjnaGQsumuyI\n W695EzxRqPqDshKR6IawIDmle9tT/XfENT/rweON59DcTDJh2mVGs+T7nSqNGSxY6FKDHa\n Jwqzbq8sXI8oq7iYlmxM+VK0L6Ffrxi+AzEUkxxWponrNkcotqkfV/FiuKjqf33NM/D5mg\n HmdbIqkZwJ7fBw/BozgfsVKRle/7zkhrDBERVlZs223h/rT4DPOLdB90JhsOLg==", "From": "Iain Buclaw <ibuclaw@gdcproject.org>", "To": "gcc-patches@gcc.gnu.org", "Cc": "Iain Buclaw <ibuclaw@gdcproject.org>", "Subject": "[committed][PATCH] d: Merge upstream dmd, druntime d1fbbb1a2f", "Date": "Tue, 21 Apr 2026 23:54:26 +0200", "Message-ID": "<20260421215426.938092-1-ibuclaw@gdcproject.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "Hi,\n\nThis patch merges the D front-end and D runtime library with upstream\ndmd d1fbbb1a2f.\n\nImports latest bug fixes from the v2.113.0 release branch.\n\nBootstrapped and regtested on x86_64-linux-gnu, committed to mainline.\n\nRegards,\nIain.\n\n---\ngcc/d/ChangeLog:\n\n\t* dmd/MERGE: Merge upstream dmd d1fbbb1a2f.\n\t* expr.cc (ExprVisitor::visit (StringExp *)): Don't generate a\n\tSTRING_CST for a mutable array type.\n\nlibphobos/ChangeLog:\n\n\t* libdruntime/MERGE: Merge upstream druntime d1fbbb1a2f.\n---\n gcc/d/dmd/MERGE | 2 +-\n gcc/d/dmd/dinterpret.d | 4 +-\n gcc/d/dmd/expressionsem.d | 2 -\n gcc/d/dmd/hdrgen.d | 13 +-\n gcc/d/expr.cc | 48 ++++++--\n gcc/testsuite/gdc.test/compilable/diag20916.d | 3 +\n gcc/testsuite/gdc.test/compilable/test11720.d | 49 ++++++++\n gcc/testsuite/gdc.test/compilable/test21039.d | 5 +\n gcc/testsuite/gdc.test/compilable/test21073.d | 16 +++\n gcc/testsuite/gdc.test/compilable/test21543.d | 116 ++++++++++++++++++\n gcc/testsuite/gdc.test/compilable/test21637.d | 26 ++++\n gcc/testsuite/gdc.test/compilable/test21707.d | 51 ++++++++\n gcc/testsuite/gdc.test/compilable/test23857.d | 15 +++\n gcc/testsuite/gdc.test/compilable/test24055.d | 15 +++\n gcc/testsuite/gdc.test/compilable/test24061.d | 15 +++\n gcc/testsuite/gdc.test/compilable/test5973.d | 41 +++++++\n gcc/testsuite/gdc.test/compilable/test6777.d | 11 ++\n .../gdc.test/fail_compilation/enum_member.d | 23 ++++\n .../gdc.test/fail_compilation/fail5851.d | 16 +++\n .../gdc.test/fail_compilation/finalswitch.d | 96 +++++++++++++++\n .../gdc.test/fail_compilation/mixinexpr.d | 11 ++\n .../named_arguments_struct_literal.d | 15 +++\n .../gdc.test/fail_compilation/test23145.d | 49 ++++++++\n .../gdc.test/fail_compilation/test8662.d | 38 ++++++\n gcc/testsuite/gdc.test/runnable/test22659.d | 16 +++\n gcc/testsuite/gdc.test/runnable/testconst.d | 34 +++++\n libphobos/libdruntime/MERGE | 2 +-\n .../core/internal/array/capacity.d | 10 +-\n .../libdruntime/core/sys/posix/sys/stat.d | 8 +-\n 29 files changed, 723 insertions(+), 27 deletions(-)\n create mode 100644 gcc/testsuite/gdc.test/compilable/test11720.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test21039.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test21073.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test21543.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test21637.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test21707.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test23857.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test24055.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test24061.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test5973.d\n create mode 100644 gcc/testsuite/gdc.test/compilable/test6777.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/enum_member.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/fail5851.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/finalswitch.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/mixinexpr.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/named_arguments_struct_literal.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/test23145.d\n create mode 100644 gcc/testsuite/gdc.test/fail_compilation/test8662.d\n create mode 100644 gcc/testsuite/gdc.test/runnable/test22659.d", "diff": "diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE\nindex eac1d04c8c6..5cfaee4f823 100644\n--- a/gcc/d/dmd/MERGE\n+++ b/gcc/d/dmd/MERGE\n@@ -1,4 +1,4 @@\n-e145b9124523d1fecd55e0702003ef86947eb745\n+d1fbbb1a2ff801cd414c7e18fefe6351e3b1d21c\n \n The first line of this file holds the git revision number of the last\n merge done from the dlang/dmd repository.\ndiff --git a/gcc/d/dmd/dinterpret.d b/gcc/d/dmd/dinterpret.d\nindex fb07953ace4..85665c5776e 100644\n--- a/gcc/d/dmd/dinterpret.d\n+++ b/gcc/d/dmd/dinterpret.d\n@@ -2547,7 +2547,9 @@ public:\n }\n }\n \n- if (expsx !is e.elements)\n+ // Only create new ArrayLiteralExp if needed (don't forget to check basis as well!)\n+ // https://github.com/dlang/dmd/issues/21039\n+ if (expsx !is e.elements || basis !is e.basis)\n {\n // todo: all tuple expansions should go in semantic phase.\n expandTuples(expsx);\ndiff --git a/gcc/d/dmd/expressionsem.d b/gcc/d/dmd/expressionsem.d\nindex 840dc0fd957..5a2fd17fdfc 100644\n--- a/gcc/d/dmd/expressionsem.d\n+++ b/gcc/d/dmd/expressionsem.d\n@@ -12632,8 +12632,6 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor\n }\n else if (t1.ty == Tsarray)\n {\n- // SliceExp cannot have static array type without context inference.\n- assert(exp.e1.op != EXP.slice);\n Expression e1x = exp.e1;\n Expression e2x = exp.e2;\n \ndiff --git a/gcc/d/dmd/hdrgen.d b/gcc/d/dmd/hdrgen.d\nindex 71e94c2a90c..24ed5f3da70 100644\n--- a/gcc/d/dmd/hdrgen.d\n+++ b/gcc/d/dmd/hdrgen.d\n@@ -1752,17 +1752,16 @@ void toCBuffer(Dsymbol s, ref OutBuffer buf, ref HdrGenState hgs)\n /*\n https://issues.dlang.org/show_bug.cgi?id=23223\n https://issues.dlang.org/show_bug.cgi?id=23222\n- This special case (initially just for modules) avoids some segfaults\n- and nicer -vcg-ast output.\n+ https://github.com/dlang/dmd/issues/21707\n+ For named symbols (modules, functions, templates, aggregates),\n+ print just the name to avoid segfaults, infinite recursion,\n+ and for nicer -vcg-ast output. Anonymous symbols (function\n+ literals) are printed in full.\n */\n- if (d.aliassym.isModule())\n- {\n+ if (!d.aliassym.isFuncLiteralDeclaration() && d.aliassym.ident)\n buf.put(d.aliassym.ident.toString());\n- }\n else\n- {\n toCBuffer(d.aliassym, buf, hgs);\n- }\n }\n else if (d.type.ty == Tfunction)\n {\ndiff --git a/gcc/d/expr.cc b/gcc/d/expr.cc\nindex 3e98fc9c51c..b24c42d9f9c 100644\n--- a/gcc/d/expr.cc\n+++ b/gcc/d/expr.cc\n@@ -2368,25 +2368,53 @@ public:\n }\n else\n {\n-\t/* Copy the string contents to a null terminated STRING_CST. */\n \tdinteger_t length = (e->len * e->sz);\n-\tchar *string = XALLOCAVEC (char, length + e->sz);\n-\tmemset (string, 0, length + e->sz);\n-\tif (length > 0)\n-\t memcpy (string, e->string, length);\n+\ttree value;\n+\ttree value_type;\n \n-\t/* String value and type includes the null terminator. */\n-\ttree value = build_string (length + e->sz, string);\n \tif (e->sz <= 4)\n-\t TREE_TYPE (value) = make_array_type (tb->nextOf (), length + 1);\n+\t value_type = make_array_type (tb->nextOf (), length + 1);\n \telse\n \t {\n \t /* Hexadecimal literal strings with an 8-byte character type are\n \t just an alternative way to store an array of `ulong'.\n \t Treat it as if it were a `uint[]' array instead. */\n \t dinteger_t resize = e->sz / 4;\n-\t TREE_TYPE (value) = make_array_type (Type::tuns32,\n-\t\t\t\t\t\t (length * resize) + resize);\n+\t value_type = make_array_type (Type::tuns32,\n+\t\t\t\t\t (length * resize) + resize);\n+\t }\n+\n+\tif (tb->nextOf ()->isMutable ())\n+\t {\n+\t /* From CTFE, a mutable `char[]' might be initialized with a\n+\t StringExp, don't use STRING_CST then. */\n+\t vec <constructor_elt, va_gc> *elms = NULL;\n+\t vec_safe_reserve (elms, e->len);\n+\t tree etype = TREE_TYPE (value_type);\n+\n+\t for (size_t i = 0; i < e->len; i++)\n+\t {\n+\t\ttree value = build_integer_cst (e->getIndex (i), etype);\n+\t\tCONSTRUCTOR_APPEND_ELT (elms, size_int (i), value);\n+\t }\n+\n+\t value = build_padded_constructor (value_type, elms);\n+\t value = build_artificial_decl (TREE_TYPE (value), value, \"A\");\n+\n+\t d_pushdecl (value);\n+\t rest_of_decl_compilation (value, 1, 0);\n+\t }\n+\telse\n+\t {\n+\t /* Copy the string contents to a null terminated STRING_CST. */\n+\t char *string = XALLOCAVEC (char, length + e->sz);\n+\t memset (string, 0, length + e->sz);\n+\t if (length > 0)\n+\t memcpy (string, e->string, length);\n+\n+\t /* String value and type includes the null terminator. */\n+\t value = build_string (length + e->sz, string);\n+\t TREE_TYPE (value) = value_type;\n \t }\n \n \tvalue = build_address (value);\ndiff --git a/gcc/testsuite/gdc.test/compilable/diag20916.d b/gcc/testsuite/gdc.test/compilable/diag20916.d\nindex aa30c94fcf3..a8321320076 100644\n--- a/gcc/testsuite/gdc.test/compilable/diag20916.d\n+++ b/gcc/testsuite/gdc.test/compilable/diag20916.d\n@@ -6,12 +6,15 @@ compilable/diag20916.d(32): Deprecation: `alias fb this` is deprecated\n compilable/diag20916.d(37): instantiated from here: `jump2!(Foo)`\n compilable/diag20916.d(42): instantiated from here: `jump1!(Foo)`\n compilable/diag20916.d(32): Deprecation: function `diag20916.FooBar.toString` is deprecated\n+compilable/diag20916.d(3): `toString` is declared here\n compilable/diag20916.d(37): instantiated from here: `jump2!(Foo)`\n compilable/diag20916.d(42): instantiated from here: `jump1!(Foo)`\n compilable/diag20916.d(32): Deprecation: template `diag20916.Bar.toString()() const` is deprecated\n+compilable/diag20916.d(15): `toString()() const` is declared here\n compilable/diag20916.d(37): instantiated from here: `jump2!(Bar)`\n compilable/diag20916.d(43): instantiated from here: `jump1!(Bar)`\n compilable/diag20916.d(21): Deprecation: variable `diag20916.Something.something` is deprecated\n+compilable/diag20916.d(28): `something` is declared here\n compilable/diag20916.d(24): instantiated from here: `nestedCheck!(Something)`\n ---\n */\ndiff --git a/gcc/testsuite/gdc.test/compilable/test11720.d b/gcc/testsuite/gdc.test/compilable/test11720.d\nnew file mode 100644\nindex 00000000000..06ea6b2d7b2\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test11720.d\n@@ -0,0 +1,49 @@\n+// https://issues.dlang.org/show_bug.cgi?id=11720\n+\n+void test11720()\n+{\n+ foo();\n+ bar();\n+}\n+\n+alias TypeTuple(T...) = T;\n+\n+void foo()()\n+{\n+ foreach (T; TypeTuple!(int, double))\n+ {\n+ static temp = T.stringof;\n+ }\n+}\n+\n+void bar()\n+{\n+ foreach (T; TypeTuple!(int, double))\n+ {\n+ static temp = T.stringof;\n+ }\n+}\n+\n+/*********************************************/\n+\n+// https://issues.dlang.org/show_bug.cgi?id=18266\n+\n+void test18266()\n+{\n+ foreach (i; 0 .. 10)\n+ {\n+ struct S\n+ {\n+ int x;\n+ }\n+ auto s = S(i);\n+ }\n+ foreach (i; 11 .. 20)\n+ {\n+ struct S\n+ {\n+ int y;\n+ }\n+ auto s = S(i);\n+ }\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test21039.d b/gcc/testsuite/gdc.test/compilable/test21039.d\nnew file mode 100644\nindex 00000000000..adc6110c751\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test21039.d\n@@ -0,0 +1,5 @@\n+// https://github.com/dlang/dmd/issues/21039\n+// Zero-length static array with scalar initializer caused ICE\n+\n+struct A { const(char)[0] b = 0; }\n+struct B { int[0] x = 5 + 5; }\ndiff --git a/gcc/testsuite/gdc.test/compilable/test21073.d b/gcc/testsuite/gdc.test/compilable/test21073.d\nnew file mode 100644\nindex 00000000000..47d788128b3\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test21073.d\n@@ -0,0 +1,16 @@\n+// https://issues.dlang.org/show_bug.cgi?id=21073\n+\n+class C\n+{\n+ auto internal() const\n+ {\n+ return 5;\n+ }\n+ alias internal this;\n+}\n+\n+void main() pure\n+{\n+ const c = new C;\n+ auto r = cast(C)c;\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test21543.d b/gcc/testsuite/gdc.test/compilable/test21543.d\nnew file mode 100644\nindex 00000000000..4914264aaf9\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test21543.d\n@@ -0,0 +1,116 @@\n+// https://issues.dlang.org/show_bug.cgi?id=21543\n+\n+class B\n+{\n+ Nullable!B data;\n+ alias data this;\n+}\n+\n+void test1()\n+{\n+ B b;\n+ Nullable!B n;\n+}\n+\n+struct Nullable(T)\n+{\n+ T payload;\n+\n+ void opAssign()(T)\n+ {\n+ move(payload);\n+ }\n+\n+ inout(T) get_() inout\n+ {\n+ return payload;\n+ }\n+\n+ alias get_ this;\n+}\n+\n+// another version with chain of 3 alias this\n+\n+struct C\n+{\n+ Nullable2 data;\n+ alias data this;\n+}\n+\n+void test2()\n+{\n+ C c;\n+ Nullable2 n2 = &c;\n+ Nullable3 n3 = &c;\n+\n+ // these are to check a sane -vcg-ast output\n+ fn1(c);\n+ fn1(n2);\n+ fn1(n3);\n+ fn2(c);\n+ fn2(n2);\n+ fn2(n3);\n+ fn3(c);\n+ fn3(n2);\n+ fn3(n3);\n+}\n+\n+void fn1(C x) {}\n+\n+void fn2(Nullable2 x) {}\n+\n+void fn3(Nullable3 x) {}\n+\n+struct Nullable2\n+{\n+ Nullable3 payload;\n+\n+ this(C* c)\n+ {\n+ payload = Nullable3(c);\n+ }\n+\n+ void opAssign()(Nullable3)\n+ {\n+ move(payload);\n+ }\n+\n+ inout(Nullable3) get_() inout\n+ {\n+ return payload;\n+ }\n+\n+ alias get_ this;\n+}\n+\n+struct Nullable3\n+{\n+ C* payload;\n+\n+ this(C* c)\n+ {\n+ payload = c;\n+ }\n+\n+ void opAssign()(C)\n+ {\n+ move(payload);\n+ }\n+\n+ inout(C) get_() inout\n+ {\n+ return *payload;\n+ }\n+\n+ alias get_ this;\n+}\n+\n+T move(T)(ref T source)\n+{\n+ return source;\n+}\n+\n+T move(T)(T source)\n+{\n+ return source;\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test21637.d b/gcc/testsuite/gdc.test/compilable/test21637.d\nnew file mode 100644\nindex 00000000000..53c0b9abe59\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test21637.d\n@@ -0,0 +1,26 @@\n+// https://github.com/dlang/dmd/issues/21637\n+// ICE in tuple comparison with conditional expression\n+\n+struct Date {\n+ short _year = 1;\n+ ubyte _month;\n+ ubyte _day = 1;\n+\n+ this(int day) { }\n+}\n+\n+struct Nullable(T){\n+ T t;\n+ short b;\n+}\n+\n+struct DateRange {\n+ Nullable!Date end;\n+}\n+\n+void main()\n+{\n+ auto thing = DateRange(\n+ (Date(1).tupleof == Date(2).tupleof) ? Nullable!Date() : Nullable!Date()\n+ );\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test21707.d b/gcc/testsuite/gdc.test/compilable/test21707.d\nnew file mode 100644\nindex 00000000000..c6c29e98032\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test21707.d\n@@ -0,0 +1,51 @@\n+// https://github.com/dlang/dmd/issues/21707\n+// Segfault with -vcg-ast and foreach on a tuple sequence\n+\n+/+\n+REQUIRED_ARGS: -vcg-ast -o-\n+OUTPUT_FILES: compilable/test21707.d.cg\n+TEST_OUTPUT:\n+---\n+foobar(T)\n+test()\n+=== compilable/test21707.d.cg\n+import object;\n+template TypeTuple(T...)\n+{\n+\talias TypeTuple = T;\n+}\n+enum foobar(T) = 2;\n+void test()\n+{\n+\t/*unrolled*/ {\n+\t\t{\n+\t\t\talias sym = foobar;\n+\t\t}\n+\t}\n+\t/*unrolled*/ {\n+\t\t{\n+\t\t\talias sym = test;\n+\t\t}\n+\t}\n+}\n+---\n++/\n+\n+template TypeTuple(T...)\n+{\n+ alias TypeTuple = T;\n+}\n+\n+template foobar(T)\n+{\n+ enum foobar = 2;\n+}\n+\n+void test()\n+{\n+ foreach (sym; TypeTuple!(foobar))\n+ pragma(msg, sym.stringof);\n+\n+ foreach (sym; TypeTuple!(test))\n+ pragma(msg, sym.stringof);\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test23857.d b/gcc/testsuite/gdc.test/compilable/test23857.d\nnew file mode 100644\nindex 00000000000..d1f6c033440\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test23857.d\n@@ -0,0 +1,15 @@\n+/* REQUIRED_ARGS: -O -inline -release\n+ */\n+\n+// https://issues.dlang.org/show_bug.cgi?id=23857\n+\n+int mars(int[] a, int u)\n+{\n+ return (a.ptr[u] < 0) ? u : (a.ptr[u] = mars(a, a.ptr[u]));\n+}\n+\n+void venus()\n+{\n+ mars([], 0);\n+ mars([], 0);\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test24055.d b/gcc/testsuite/gdc.test/compilable/test24055.d\nnew file mode 100644\nindex 00000000000..551a2b8f0d3\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test24055.d\n@@ -0,0 +1,15 @@\n+// REQUIRED_ARGS: -o-\n+// https://issues.dlang.org/show_bug.cgi?id=24055\n+// is(x == __parameters) does not work on function pointer/delegate types\n+\n+void function(int) fp;\n+void delegate(int) dg;\n+\n+static assert(is(typeof(fp) == __parameters));\n+static assert(is(typeof(*fp) == __parameters));\n+static assert(is(typeof(dg) == __parameters));\n+\n+static if(is(typeof(dg) FP == delegate))\n+ static assert(is(FP == __parameters)); // OK\n+else\n+ static assert(0);\ndiff --git a/gcc/testsuite/gdc.test/compilable/test24061.d b/gcc/testsuite/gdc.test/compilable/test24061.d\nnew file mode 100644\nindex 00000000000..f40a38ba8e7\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test24061.d\n@@ -0,0 +1,15 @@\n+// https://issues.dlang.org/show_bug.cgi?id=24061\n+\n+class Exception2\n+{\n+ this(string, int) {}\n+}\n+\n+class E : Exception2\n+{\n+ this(int i)\n+ {\n+ scope (success) assert(0, \"assume nothrow\");\n+ super(\"hehe\", 2);\n+ }\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test5973.d b/gcc/testsuite/gdc.test/compilable/test5973.d\nnew file mode 100644\nindex 00000000000..a54b0ae173a\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test5973.d\n@@ -0,0 +1,41 @@\n+// https://issues.dlang.org/show_bug.cgi?id=5973\n+\n+class A { int a = 1; }\n+class B { int b = 2; }\n+class C : A\n+{\n+ B obj;\n+ alias obj this;\n+ this(){ obj = new B(); }\n+}\n+class X : C {}\n+\n+class D\n+{\n+ int i;\n+}\n+\n+class E\n+{\n+ D x;\n+ alias x this;\n+}\n+\n+class F : E\n+{\n+ void test()\n+ {\n+ i = 5;\n+ }\n+}\n+\n+void main()\n+{\n+ auto c = new C();\n+ assert(c.a == 1); // lookup C -> A, OK\n+ assert(c.b == 2); // lookup C => B, OK\n+\n+ auto x = new X();\n+ assert(x.a == 1); // lookup X -> C -> A, OK\n+ assert(x.b == 2); // lookup X -> C => B, NG (Line 17)\n+}\ndiff --git a/gcc/testsuite/gdc.test/compilable/test6777.d b/gcc/testsuite/gdc.test/compilable/test6777.d\nnew file mode 100644\nindex 00000000000..161a94a179d\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/compilable/test6777.d\n@@ -0,0 +1,11 @@\n+struct S {}\n+\n+class C {\n+ S s;\n+ alias s this;\n+}\n+\n+void main() {\n+ auto c = new C;\n+ auto p = cast(void*) c;\n+}\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/enum_member.d b/gcc/testsuite/gdc.test/fail_compilation/enum_member.d\nnew file mode 100644\nindex 00000000000..94c6f981195\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/enum_member.d\n@@ -0,0 +1,23 @@\n+/*\n+TEST_OUTPUT:\n+---\n+fail_compilation/enum_member.d(14): Error: basic type expected, not `for`\n+fail_compilation/enum_member.d(15): Error: no identifier for declarator `T`\n+fail_compilation/enum_member.d(15): Error: found `@` when expecting `,`\n+fail_compilation/enum_member.d(22): Error: found `}` when expecting `identifier`\n+fail_compilation/enum_member.d(24): Error: found `End of File` when expecting `,`\n+fail_compilation/enum_member.d(24): Error: premature end of file\n+---\n+*/\n+enum\n+{\n+ for,\n+ T @a b = 1\n+}\n+// See also: fail10285.d\n+\n+enum E\n+{\n+ @a\n+}\n+// See also: fail20538.d\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/fail5851.d b/gcc/testsuite/gdc.test/fail_compilation/fail5851.d\nnew file mode 100644\nindex 00000000000..236a956de92\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/fail5851.d\n@@ -0,0 +1,16 @@\n+/*\n+TEST_OUTPUT:\n+---\n+fail_compilation/fail5851.d(11): Error: alias this is not reachable as `Foo` already converts to `object.Object`\n+---\n+*/\n+\n+class Foo\n+{\n+ Object o;\n+ alias o this;\n+}\n+\n+void main()\n+{\n+}\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/finalswitch.d b/gcc/testsuite/gdc.test/fail_compilation/finalswitch.d\nnew file mode 100644\nindex 00000000000..634700940a5\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/finalswitch.d\n@@ -0,0 +1,96 @@\n+/*\n+TEST_OUTPUT:\n+---\n+fail_compilation/finalswitch.d(37): Error: missing cases for `enum` members in `final switch`:\n+fail_compilation/finalswitch.d(37): `B`\n+fail_compilation/finalswitch.d(55): Error: missing cases for `enum` members in `final switch`:\n+fail_compilation/finalswitch.d(55): `b`\n+fail_compilation/finalswitch.d(69): Error: missing cases for `enum` members in `final switch`:\n+fail_compilation/finalswitch.d(69): `B`\n+fail_compilation/finalswitch.d(87): Error: missing cases for `enum` members in `final switch`:\n+fail_compilation/finalswitch.d(87): `m3`\n+fail_compilation/finalswitch.d(87): `m4`\n+fail_compilation/finalswitch.d(87): `m5`\n+fail_compilation/finalswitch.d(87): `m6`\n+fail_compilation/finalswitch.d(87): `m7`\n+fail_compilation/finalswitch.d(87): `m9`\n+fail_compilation/finalswitch.d(92): Error: missing cases for `enum` members in `final switch`:\n+fail_compilation/finalswitch.d(92): `m1`\n+fail_compilation/finalswitch.d(92): `m2`\n+fail_compilation/finalswitch.d(92): `m3`\n+fail_compilation/finalswitch.d(92): `m4`\n+fail_compilation/finalswitch.d(92): `m5`\n+fail_compilation/finalswitch.d(92): `m6`\n+fail_compilation/finalswitch.d(92): ... (4 more, -v to show) ...\n+---\n+*/\n+\n+// https://issues.dlang.org/show_bug.cgi?id=4517\n+enum E : ushort\n+{\n+ A, B\n+}\n+\n+void test4517()\n+{\n+ E e;\n+ final switch(e)\n+ {\n+ case E.A:\n+ break;\n+ }\n+}\n+\n+// https://issues.dlang.org/show_bug.cgi?id=9368\n+enum E1\n+{\n+ a,\n+ b\n+}\n+\n+void test9368()\n+{\n+ alias E1 F;\n+ F f;\n+ final switch (f)\n+ {\n+ case F.a:\n+ }\n+}\n+\n+enum G\n+{\n+ A,B,C\n+}\n+\n+void test286()\n+{\n+ G e;\n+ final switch (e)\n+ {\n+ case G.A:\n+// case G.B:\n+ case G.C:\n+ {}\n+ }\n+}\n+\n+// https://issues.dlang.org/show_bug.cgi?id=22038\n+\n+enum H {\n+ m1, m2, m3, m4, m5,\n+ m6, m7, m8, m9, m10,\n+}\n+\n+void test22038()\n+{\n+ final switch (H.init)\n+ {\n+ case H.m1, H.m2, H.m8, H.m10: break;\n+ }\n+\n+ final switch (H.init)\n+ {\n+\n+ }\n+}\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/mixinexpr.d b/gcc/testsuite/gdc.test/fail_compilation/mixinexpr.d\nnew file mode 100644\nindex 00000000000..d5ae514c959\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/mixinexpr.d\n@@ -0,0 +1,11 @@\n+/*\n+TEST_OUTPUT:\n+---\n+fail_compilation/mixinexpr.d-mixin-10(10): Error: unexpected token `;` after function expression\n+fail_compilation/mixinexpr.d-mixin-10(10): while parsing string mixin expression `(int i) => true;`\n+fail_compilation/mixinexpr.d-mixin-11(11): Error: unexpected token `j` after identifier expression\n+fail_compilation/mixinexpr.d-mixin-11(11): while parsing string mixin expression `i j`\n+---\n+*/\n+enum e = mixin(\"(int i) => true;\");\n+enum f = mixin(\"i j\");\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/named_arguments_struct_literal.d b/gcc/testsuite/gdc.test/fail_compilation/named_arguments_struct_literal.d\nnew file mode 100644\nindex 00000000000..5b8f2c621cc\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/named_arguments_struct_literal.d\n@@ -0,0 +1,15 @@\n+/**\n+TEST_OUTPUT:\n+---\n+fail_compilation/named_arguments_struct_literal.d(14): Error: trying to initialize past the last field `z` of `S`\n+---\n+*/\n+\n+// https://issues.dlang.org/show_bug.cgi?id=24281\n+\n+struct S { int y, z = 3; }\n+\n+S s = S(\n+\tz: 2,\n+\t3,\n+);\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/test23145.d b/gcc/testsuite/gdc.test/fail_compilation/test23145.d\nnew file mode 100644\nindex 00000000000..0d69c8b884b\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/test23145.d\n@@ -0,0 +1,49 @@\n+/* REQUIRED_ARGS: -preview=dip1000\n+TEST_OUTPUT:\n+---\n+fail_compilation/test23145.d(117): Error: `scope` allocation of `c` with a non-`scope` constructor is not allowed in a `@safe` function\n+fail_compilation/test23145.d(111): is the location of the constructor\n+fail_compilation/test23145.d(124): Error: `scope` allocation of `c` with a non-`scope` constructor is not allowed in a `@safe` function\n+fail_compilation/test23145.d(111): is the location of the constructor\n+fail_compilation/test23145.d(125): Error: `@safe` function `test23145.bax` cannot call `@system` function `test23145.inferred`\n+fail_compilation/test23145.d(131): and `scope` allocation of `c` with a non-`scope` constructor makes it fail to infer `@safe`\n+fail_compilation/test23145.d(129): `test23145.inferred` is declared here\n+---\n+*/\n+\n+// https://issues.dlang.org/show_bug.cgi?id=23145\n+\n+#line 100\n+\n+class D\n+{\n+ C c;\n+}\n+\n+class C\n+{\n+ D d;\n+ int x=3;\n+ this(int i) scope @safe @nogc;\n+ this(D d) @safe @nogc;\n+}\n+\n+C foo(D d) @nogc @safe\n+{\n+ scope e = new C(1); // ok\n+ scope c = new C(d); // error\n+ return c.d.c;\n+}\n+\n+C bax(D d) @safe\n+{\n+ scope e = new C(1); // ok\n+ scope c = new C(d); // error\n+ inferred(d);\n+ return c.d.c;\n+}\n+\n+auto inferred(D d)\n+{\n+ scope c = new C(d); // infer system\n+}\ndiff --git a/gcc/testsuite/gdc.test/fail_compilation/test8662.d b/gcc/testsuite/gdc.test/fail_compilation/test8662.d\nnew file mode 100644\nindex 00000000000..18fcf7e7c08\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/fail_compilation/test8662.d\n@@ -0,0 +1,38 @@\n+/*\n+TEST_OUTPUT:\n+---\n+fail_compilation/test8662.d(22): Error: label `Label` is already defined\n+fail_compilation/test8662.d(21): first definition is here\n+fail_compilation/test8662.d(25): Error: label `Label` is already defined\n+fail_compilation/test8662.d(21): first definition is here\n+fail_compilation/test8662.d(31): Error: label `Label2` is duplicated\n+fail_compilation/test8662.d(31): labels cannot be used in a static foreach with more than 1 iteration\n+fail_compilation/test8662.d(36): Error: label `Label3` is duplicated\n+fail_compilation/test8662.d(36): labels cannot be used in a static foreach with more than 1 iteration\n+---\n+*/\n+// Issue 8662 - Labels rejected in static foreach loop\n+\n+alias AliasSeq(T...) = T;\n+\n+void f()\n+{\n+ {\n+ Label:\n+ Label:\n+ }\n+ {\n+ Label:\n+ Label:\n+ }\n+ // static foreach\n+ foreach (x; AliasSeq!(1, 2, 3, 4, 5))\n+ {\n+ Label2:\n+ }\n+\n+ static foreach (x; 0 .. 3)\n+ {\n+ Label3:\n+ }\n+}\ndiff --git a/gcc/testsuite/gdc.test/runnable/test22659.d b/gcc/testsuite/gdc.test/runnable/test22659.d\nnew file mode 100644\nindex 00000000000..f872d468aa0\n--- /dev/null\n+++ b/gcc/testsuite/gdc.test/runnable/test22659.d\n@@ -0,0 +1,16 @@\n+// https://github.com/dlang/dmd/issues/22659\n+\n+int[] foo()\n+{\n+ int[4] sarr = [10, 20, 30, 40];\n+ int[] data = new int[4];\n+ cast(int[4]) data[0 .. 4] = sarr;\n+ return data;\n+}\n+\n+void main()\n+{\n+ auto result = foo();\n+ assert(result == [10, 20, 30, 40]);\n+ static assert(foo() == [10, 20, 30, 40]);\n+}\ndiff --git a/gcc/testsuite/gdc.test/runnable/testconst.d b/gcc/testsuite/gdc.test/runnable/testconst.d\nindex 43f986de9db..d3033a65971 100644\n--- a/gcc/testsuite/gdc.test/runnable/testconst.d\n+++ b/gcc/testsuite/gdc.test/runnable/testconst.d\n@@ -3793,6 +3793,39 @@ static assert(( immutable dstring[] ).stringof == \"immutable(dstring[])\"\n static assert(( immutable dstring[1] ).stringof == \"immutable(dstring[1])\" );\n static assert(( immutable dstring[int]).stringof == \"immutable(dstring[int])\" );\n \n+/************************************/\n+// https://github.com/dlang/dmd/issues/21194\n+// Global char[] initialized with dup of string literal must be in writable memory\n+\n+char[] ta = \"foo\".dup;\n+wchar[] tb = \"bar\"w.dup;\n+dchar[] tc = \"baz\"d.dup;\n+\n+__gshared char[] ga = \"FOO\".dup;\n+__gshared wchar[] gb = \"BAR\"w.dup;\n+__gshared dchar[] gc = \"BAZ\"d.dup;\n+\n+void test21194()\n+{\n+ ta[0] = 'B';\n+ assert(ta == \"Boo\");\n+\n+ tb[0] = 'B';\n+ assert(tb == \"Bar\"w);\n+\n+ tc[0] = 'B';\n+ assert(tc == \"Baz\"d);\n+\n+ ga[0] = 'b';\n+ assert(ga == \"bOO\");\n+\n+ gb[0] = 'b';\n+ assert(gb == \"bAR\"w);\n+\n+ gc[0] = 'b';\n+ assert(gc == \"bAZ\"d);\n+}\n+\n /************************************/\n \n int main()\n@@ -3924,6 +3957,7 @@ int main()\n test11226();\n test11768();\n test13011();\n+ test21194();\n \n printf(\"Success\\n\");\n return 0;\ndiff --git a/libphobos/libdruntime/MERGE b/libphobos/libdruntime/MERGE\nindex eac1d04c8c6..5cfaee4f823 100644\n--- a/libphobos/libdruntime/MERGE\n+++ b/libphobos/libdruntime/MERGE\n@@ -1,4 +1,4 @@\n-e145b9124523d1fecd55e0702003ef86947eb745\n+d1fbbb1a2ff801cd414c7e18fefe6351e3b1d21c\n \n The first line of this file holds the git revision number of the last\n merge done from the dlang/dmd repository.\ndiff --git a/libphobos/libdruntime/core/internal/array/capacity.d b/libphobos/libdruntime/core/internal/array/capacity.d\nindex cbcc3d3b6d2..fa867f162f6 100644\n--- a/libphobos/libdruntime/core/internal/array/capacity.d\n+++ b/libphobos/libdruntime/core/internal/array/capacity.d\n@@ -288,7 +288,10 @@ private size_t _d_arraysetlengthT_(Tarr : T[], T)(return ref scope Tarr arr, siz\n if (!arr.ptr)\n {\n assert(arr.length == 0);\n- void* ptr = GC.malloc(newsize, gcAttrs);\n+ version (D_TypeInfo)\n+ void* ptr = GC.malloc(newsize, gcAttrs, typeid(T));\n+ else\n+ void* ptr = GC.malloc(newsize, gcAttrs, null);\n if (!ptr)\n {\n onOutOfMemoryError();\n@@ -324,7 +327,10 @@ private size_t _d_arraysetlengthT_(Tarr : T[], T)(return ref scope Tarr arr, siz\n \n if (!gc_expandArrayUsed(newdata[0 .. oldsize], newsize, isShared))\n {\n- newdata = GC.malloc(newsize, gcAttrs);\n+ version (D_TypeInfo)\n+ newdata = GC.malloc(newsize, gcAttrs, typeid(T));\n+ else\n+ newdata = GC.malloc(newsize, gcAttrs, null);\n if (!newdata)\n {\n onOutOfMemoryError();\ndiff --git a/libphobos/libdruntime/core/sys/posix/sys/stat.d b/libphobos/libdruntime/core/sys/posix/sys/stat.d\nindex a14fc149d70..83590b5b996 100644\n--- a/libphobos/libdruntime/core/sys/posix/sys/stat.d\n+++ b/libphobos/libdruntime/core/sys/posix/sys/stat.d\n@@ -2030,10 +2030,12 @@ else version (Darwin)\n int stat(const scope char*, stat_t*);\n }\n int fchmodat(int, const scope char*, mode_t, int);\n- int futimens(int, ref const(timespec)[2]);\n int mkdirat(int, const scope char*, mode_t);\n- int mkfifoat(int, const scope char*, mode_t);\n- int utimensat(int, const scope char*, ref const(timespec)[2], int);\n+ // OSX available starting 10.12\n+ //int futimens(int, ref const(timespec)[2]);\n+ //int utimensat(int, const scope char*, ref const(timespec)[2], int);\n+ // OSX available starting 13\n+ //int mkfifoat(int, const scope char*, mode_t);\n }\n else version (FreeBSD)\n {\n", "prefixes": [ "committed" ] }