diff mbox series

[committed] d: Merge upstream dmd 5cc71ff83, druntime 1134b710

Message ID 20210406174651.1594258-1-ibuclaw@gdcproject.org
State New
Headers show
Series [committed] d: Merge upstream dmd 5cc71ff83, druntime 1134b710 | expand

Commit Message

Iain Buclaw April 6, 2021, 5:46 p.m. UTC
Hi,

This patch merges the D front-end implementation with upstream dmd
5cc71ff83, and the Phobos standard library with druntime 1134b710.

D front-end changes:

 - Fix ICEs that occurred when using opaque enums.

 - Update `pragma(printf)' checking code to work on 16-bit targets.

Phobos change:

 - Don't compile in argTypes code on AArch64

Bootstrapped and regression tested on x86_64-linux-gnu/-m32/-mx32 and
committed to mainline.

Regards,
Iain.

---
gcc/d/ChangeLog:

	* dmd/MERGE: Merge upstream dmd 5cc71ff83.

libphobos/ChangeLog:

	* libdruntime/MERGE: Merge upstream druntime 1134b710.
---
 gcc/d/dmd/MERGE                               |   2 +-
 gcc/d/dmd/chkformat.c                         |  44 +++--
 gcc/d/dmd/denum.c                             |  54 +++---
 gcc/d/dmd/dsymbolsem.c                        |  17 +-
 gcc/d/dmd/mtype.c                             |  17 --
 .../gdc.test/fail_compilation/chkformat.d     |  34 +++-
 .../gdc.test/fail_compilation/enum_init.d     | 171 ++++++++++++++++++
 .../gdc.test/fail_compilation/fail109.d       |   8 +-
 .../gdc.test/fail_compilation/ice10770.d      |  13 --
 .../gdc.test/fail_compilation/ice8511.d       |  13 --
 libphobos/libdruntime/MERGE                   |   2 +-
 libphobos/libdruntime/object.d                |   2 +-
 12 files changed, 287 insertions(+), 90 deletions(-)
 create mode 100644 gcc/testsuite/gdc.test/fail_compilation/enum_init.d
 delete mode 100644 gcc/testsuite/gdc.test/fail_compilation/ice10770.d
 delete mode 100644 gcc/testsuite/gdc.test/fail_compilation/ice8511.d
diff mbox series

Patch

diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index 86475c80d35..a89184498c3 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@ 
-3b808e838bb00f527eb4ed5281cd985756237b8f
+5cc71ff830fcfba218152360014298550be9180e
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/chkformat.c b/gcc/d/dmd/chkformat.c
index d00b658ca00..a4a97c9bf50 100644
--- a/gcc/d/dmd/chkformat.c
+++ b/gcc/d/dmd/chkformat.c
@@ -610,7 +610,7 @@  bool checkPrintfFormat(const Loc &loc, const char *format, Expressions &args, bo
         Type *t = e->type->toBasetype();
         Type *tnext = t->nextOf();
         const unsigned c_longsize = target.c.longsize;
-        const bool is64bit = global.params.is64bit;
+        const unsigned ptrsize = target.ptrsize;
 
         // Types which are promoted to int are allowed.
         // Spec: C99 6.5.2.2.7
@@ -619,46 +619,56 @@  bool checkPrintfFormat(const Loc &loc, const char *format, Expressions &args, bo
             case Format_u:      // unsigned int
             case Format_d:      // int
                 if (t->ty != Tint32 && t->ty != Tuns32)
-                    errorPrintfFormat(NULL, slice, e, "int", t);
+                    errorPrintfFormat(NULL, slice, e, fmt == Format_u ? "uint" : "int", t);
                 break;
 
             case Format_hhu:    // unsigned char
             case Format_hhd:    // signed char
                 if (t->ty != Tint32 && t->ty != Tuns32 && t->ty != Tint8 && t->ty != Tuns8)
-                    errorPrintfFormat(NULL, slice, e, "byte", t);
+                    errorPrintfFormat(NULL, slice, e, fmt == Format_hhu ? "ubyte" : "byte", t);
                 break;
 
             case Format_hu:     // unsigned short int
             case Format_hd:     // short int
                 if (t->ty != Tint32 && t->ty != Tuns32 && t->ty != Tint16 && t->ty != Tuns16)
-                    errorPrintfFormat(NULL, slice, e, "short", t);
+                    errorPrintfFormat(NULL, slice, e, fmt == Format_hu ? "ushort" : "short", t);
                 break;
 
             case Format_lu:     // unsigned long int
             case Format_ld:     // long int
                 if (!(t->isintegral() && t->size() == c_longsize))
-                    errorPrintfFormat(NULL, slice, e, (c_longsize == 4 ? "int" : "long"), t);
+                {
+                    if (fmt == Format_lu)
+                        errorPrintfFormat(NULL, slice, e, (c_longsize == 4 ? "uint" : "ulong"), t);
+                    else
+                        errorPrintfFormat(NULL, slice, e, (c_longsize == 4 ? "int" : "long"), t);
+                }
                 break;
 
             case Format_llu:    // unsigned long long int
             case Format_lld:    // long long int
                 if (t->ty != Tint64 && t->ty != Tuns64)
-                    errorPrintfFormat(NULL, slice, e, "long", t);
+                    errorPrintfFormat(NULL, slice, e, fmt == Format_llu ? "ulong" : "long", t);
                 break;
 
             case Format_ju:     // uintmax_t
             case Format_jd:     // intmax_t
                 if (t->ty != Tint64 && t->ty != Tuns64)
-                    errorPrintfFormat(NULL, slice, e, "core.stdc.stdint.intmax_t", t);
+                {
+                    if (fmt == Format_ju)
+                        errorPrintfFormat(NULL, slice, e, "core.stdc.stdint.uintmax_t", t);
+                    else
+                        errorPrintfFormat(NULL, slice, e, "core.stdc.stdint.intmax_t", t);
+                }
                 break;
 
             case Format_zd:     // size_t
-                if (!(t->isintegral() && t->size() == (is64bit ? 8 : 4)))
+                if (!(t->isintegral() && t->size() == ptrsize))
                     errorPrintfFormat(NULL, slice, e, "size_t", t);
                 break;
 
             case Format_td:     // ptrdiff_t
-                if (!(t->isintegral() && t->size() == (is64bit ? 8 : 4)))
+                if (!(t->isintegral() && t->size() == ptrsize))
                     errorPrintfFormat(NULL, slice, e, "ptrdiff_t", t);
                 break;
 
@@ -685,7 +695,7 @@  bool checkPrintfFormat(const Loc &loc, const char *format, Expressions &args, bo
                 break;
 
             case Format_ln:     // pointer to long int
-                if (!(t->ty == Tpointer && tnext->isintegral() && tnext->size() == c_longsize))
+                if (!(t->ty == Tpointer && tnext->isintegral() && !tnext->isunsigned() && tnext->size() == c_longsize))
                     errorPrintfFormat(NULL, slice, e, (c_longsize == 4 ? "int*" : "long*"), t);
                 break;
 
@@ -710,12 +720,12 @@  bool checkPrintfFormat(const Loc &loc, const char *format, Expressions &args, bo
                 break;
 
             case Format_zn:     // pointer to size_t
-                if (!(t->ty == Tpointer && tnext->ty == (is64bit ? Tuns64 : Tuns32)))
+                if (!(t->ty == Tpointer && tnext->isintegral() && tnext->isunsigned() && tnext->size() == ptrsize))
                     errorPrintfFormat(NULL, slice, e, "size_t*", t);
                 break;
 
             case Format_tn:     // pointer to ptrdiff_t
-                if (!(t->ty == Tpointer && tnext->ty == (is64bit ? Tint64 : Tint32)))
+                if (!(t->ty == Tpointer && tnext->isintegral() && !tnext->isunsigned() && tnext->size() == ptrsize))
                     errorPrintfFormat(NULL, slice, e, "ptrdiff_t*", t);
                 break;
 
@@ -845,7 +855,7 @@  bool checkScanfFormat(const Loc &loc, const char *format, Expressions &args, boo
         Type *t = e->type->toBasetype();
         Type *tnext = t->nextOf();
         const unsigned c_longsize = target.c.longsize;
-        const bool is64bit = global.params.is64bit;
+        const unsigned ptrsize = target.ptrsize;
 
         switch (fmt)
         {
@@ -887,13 +897,13 @@  bool checkScanfFormat(const Loc &loc, const char *format, Expressions &args, boo
 
             case Format_zn:
             case Format_zd:     // pointer to size_t
-                if (!(t->ty == Tpointer && tnext->ty == (is64bit ? Tuns64 : Tuns32)))
+                if (!(t->ty == Tpointer && tnext->isintegral() && tnext->isunsigned() && tnext->size() == ptrsize))
                     errorScanfFormat(NULL, slice, e, "size_t*", t);
                 break;
 
             case Format_tn:
             case Format_td:     // pointer to ptrdiff_t
-                if (!(t->ty == Tpointer && tnext->ty == (is64bit ? Tint64 : Tint32)))
+                if (!(t->ty == Tpointer && tnext->isintegral() && !tnext->isunsigned() && tnext->size() == ptrsize))
                     errorScanfFormat(NULL, slice, e, "ptrdiff_t*", t);
                 break;
 
@@ -913,7 +923,7 @@  bool checkScanfFormat(const Loc &loc, const char *format, Expressions &args, boo
                 break;
 
             case Format_lu:     // pointer to unsigned long int
-                if (!(t->ty == Tpointer && tnext->ty == (is64bit ? Tuns64 : Tuns32)))
+                if (!(t->ty == Tpointer && tnext->isintegral() && tnext->isunsigned() && tnext->size() == c_longsize))
                     errorScanfFormat(NULL, slice, e, (c_longsize == 4 ? "uint*" : "ulong*"), t);
                 break;
 
@@ -923,7 +933,7 @@  bool checkScanfFormat(const Loc &loc, const char *format, Expressions &args, boo
                 break;
 
             case Format_ju:     // pointer to uintmax_t
-                if (!(t->ty == Tpointer && tnext->ty == (is64bit ? Tuns64 : Tuns32)))
+                if (!(t->ty == Tpointer && tnext->ty == Tuns64))
                     errorScanfFormat(NULL, slice, e, "ulong*", t);
                 break;
 
diff --git a/gcc/d/dmd/denum.c b/gcc/d/dmd/denum.c
index bfd3b7274f4..b00eaa02f9d 100644
--- a/gcc/d/dmd/denum.c
+++ b/gcc/d/dmd/denum.c
@@ -122,7 +122,7 @@  Expression *EnumDeclaration::getMaxMinValue(Loc loc, Identifier *id)
         dsymbolSemantic(this, _scope);
     if (errors)
         goto Lerrors;
-    if (semanticRun == PASSinit || !members)
+    if (!members)
     {
         if (isSpecial())
         {
@@ -131,7 +131,7 @@  Expression *EnumDeclaration::getMaxMinValue(Loc loc, Identifier *id)
             return memtype->getProperty(loc, id, 0);
         }
 
-        error("is forward referenced looking for .%s", id->toChars());
+        error(loc, "is opaque and has no `.%s`", id->toChars());
         goto Lerrors;
     }
     if (!(memtype && memtype->isintegral()))
@@ -148,12 +148,21 @@  Expression *EnumDeclaration::getMaxMinValue(Loc loc, Identifier *id)
         if (!em)
             continue;
         if (em->errors)
-            goto Lerrors;
+        {
+            errors = true;
+            continue;
+        }
+
+        if (em->semanticRun < PASSsemanticdone)
+        {
+            em->error("is forward referenced looking for `.%s`", id->toChars());
+            errors = true;
+            continue;
+        }
 
-        Expression *e = em->value();
         if (first)
         {
-            *pval = e;
+            *pval = em->value();
             first = false;
         }
         else
@@ -168,15 +177,23 @@  Expression *EnumDeclaration::getMaxMinValue(Loc loc, Identifier *id)
              *   if (e > maxval)
              *      maxval = e;
              */
+            Expression *e = em->value();
             Expression *ec = new CmpExp(id == Id::max ? TOKgt : TOKlt, em->loc, e, *pval);
             inuse++;
             ec = expressionSemantic(ec, em->_scope);
             inuse--;
             ec = ec->ctfeInterpret();
+            if (ec->op == TOKerror)
+            {
+                errors = true;
+                continue;
+            }
             if (ec->toInteger())
                 *pval = e;
         }
     }
+    if (errors)
+        goto Lerrors;
 Ldone:
   {
     Expression *e = *pval;
@@ -213,16 +230,17 @@  Expression *EnumDeclaration::getDefaultValue(Loc loc)
         dsymbolSemantic(this, _scope);
     if (errors)
         goto Lerrors;
-    if (semanticRun == PASSinit || !members)
+    if (!members)
     {
         if (isSpecial())
         {
             /* Allow these special enums to not need a member list
              */
-            return memtype->defaultInit(loc);
+            defaultval = memtype->defaultInit(loc);
+            return defaultval;
         }
 
-        error(loc, "forward reference of %s.init", toChars());
+        error(loc, "is opaque and has no default initializer");
         goto Lerrors;
     }
 
@@ -231,6 +249,12 @@  Expression *EnumDeclaration::getDefaultValue(Loc loc)
         EnumMember *em = (*members)[i]->isEnumMember();
         if (em)
         {
+            if (em->semanticRun < PASSsemanticdone)
+            {
+                error(loc, "forward reference of `%s.init`", toChars());
+                goto Lerrors;
+            }
+
             defaultval = em->value();
             return defaultval;
         }
@@ -252,15 +276,10 @@  Type *EnumDeclaration::getMemtype(Loc loc)
          */
         if (memtype)
             memtype = typeSemantic(memtype, loc, _scope);
-        else
-        {
-            if (!isAnonymous() && members)
-                memtype = Type::tint32;
-        }
     }
     if (!memtype)
     {
-        if (!isAnonymous() && members)
+        if (!isAnonymous() && (members || semanticRun >= PASSsemanticdone))
             memtype = Type::tint32;
         else
         {
@@ -307,13 +326,6 @@  Dsymbol *EnumDeclaration::search(const Loc &loc, Identifier *ident, int flags)
         dsymbolSemantic(this, _scope);
     }
 
-    if (!members || !symtab || _scope)
-    {
-        error("is forward referenced when looking for `%s`", ident->toChars());
-        //*(char*)0=0;
-        return NULL;
-    }
-
     Dsymbol *s = ScopeDsymbol::search(loc, ident, flags);
     return s;
 }
diff --git a/gcc/d/dmd/dsymbolsem.c b/gcc/d/dmd/dsymbolsem.c
index 26e23e98587..7e1a85846fd 100644
--- a/gcc/d/dmd/dsymbolsem.c
+++ b/gcc/d/dmd/dsymbolsem.c
@@ -415,7 +415,19 @@  public:
             TypeStruct *ts = (TypeStruct *)tb;
             if (!ts->sym->members)
             {
-                dsym->error("no definition of struct %s", ts->toChars());
+                dsym->error("no definition of struct `%s`", ts->toChars());
+
+                // Explain why the definition is required when it's part of another type
+                if (!dsym->type->isTypeStruct())
+                {
+                    // Prefer Loc of the dependant type
+                    Dsymbol *s = dsym->type->toDsymbol(sc);
+                    Loc loc = s ? s->loc : dsym->loc;
+                    errorSupplemental(loc, "required by type `%s`", dsym->type->toChars());
+                }
+
+                // Flag variable as error to avoid invalid error messages due to unknown size
+                dsym->type = Type::terror;
             }
         }
         if ((dsym->storage_class & STCauto) && !inferred)
@@ -1737,6 +1749,9 @@  public:
                     ed->semanticRun = PASSinit;
                     return;
                 }
+                else
+                    // Ensure that semantic is run to detect. e.g. invalid forward references
+                    dsymbolSemantic(sym, sc);
             }
             if (ed->memtype->ty == Tvoid)
             {
diff --git a/gcc/d/dmd/mtype.c b/gcc/d/dmd/mtype.c
index 6b01999bc7c..57aa244b8b8 100644
--- a/gcc/d/dmd/mtype.c
+++ b/gcc/d/dmd/mtype.c
@@ -6806,23 +6806,6 @@  Expression *TypeEnum::dotExp(Scope *sc, Expression *e, Identifier *ident, int fl
 
     if (sym->semanticRun < PASSsemanticdone)
         dsymbolSemantic(sym, NULL);
-    if (!sym->members)
-    {
-        if (sym->isSpecial())
-        {
-            /* Special enums forward to the base type
-             */
-            e = sym->memtype->dotExp(sc, e, ident, flag);
-        }
-        else if (!(flag & 1))
-        {
-            sym->error("is forward referenced when looking for `%s`", ident->toChars());
-            e = new ErrorExp();
-        }
-        else
-            e = NULL;
-        return e;
-    }
 
     Dsymbol *s = sym->search(e->loc, ident);
     if (!s)
diff --git a/gcc/testsuite/gdc.test/fail_compilation/chkformat.d b/gcc/testsuite/gdc.test/fail_compilation/chkformat.d
index 7451b3f506b..e9ed2415d7c 100644
--- a/gcc/testsuite/gdc.test/fail_compilation/chkformat.d
+++ b/gcc/testsuite/gdc.test/fail_compilation/chkformat.d
@@ -36,7 +36,7 @@  fail_compilation/chkformat.d(214): Deprecation: argument `0` for format specific
 fail_compilation/chkformat.d(215): Deprecation: argument `0` for format specification `"%hhu"` must be `ubyte*`, not `int`
 fail_compilation/chkformat.d(216): Deprecation: argument `0` for format specification `"%hu"` must be `ushort*`, not `int`
 fail_compilation/chkformat.d(218): Deprecation: argument `0` for format specification `"%llu"` must be `ulong*`, not `int`
-fail_compilation/chkformat.d(219): Deprecation: argument `0` for format specification `"%ju"` must be `ulong*`, not `int`
+fail_compilation/chkformat.d(219): Deprecation: argument `0` for format specification `"%ju"` must be `core.stdc.stdint.uintmax_t*`, not `int`
 fail_compilation/chkformat.d(220): Deprecation: argument `0` for format specification `"%zu"` must be `size_t*`, not `int`
 fail_compilation/chkformat.d(221): Deprecation: argument `0` for format specification `"%tu"` must be `ptrdiff_t*`, not `int`
 fail_compilation/chkformat.d(222): Deprecation: argument `8.0L` for format specification `"%g"` must be `float*`, not `real`
@@ -137,3 +137,35 @@  void test302() { va_list vargs; vscanf("%Q", vargs); }
 //void test() { vscanf(); }
 //void test() { vfscanf(); }
 //void test() { vsscanf(); }
+
+/* TEST_OUTPUT:
+---
+fail_compilation/chkformat.d(401): Deprecation: argument `p` for format specification `"%u"` must be `uint`, not `char*`
+fail_compilation/chkformat.d(402): Deprecation: argument `p` for format specification `"%d"` must be `int`, not `char*`
+fail_compilation/chkformat.d(403): Deprecation: argument `p` for format specification `"%hhu"` must be `ubyte`, not `char*`
+fail_compilation/chkformat.d(404): Deprecation: argument `p` for format specification `"%hhd"` must be `byte`, not `char*`
+fail_compilation/chkformat.d(405): Deprecation: argument `p` for format specification `"%hu"` must be `ushort`, not `char*`
+fail_compilation/chkformat.d(406): Deprecation: argument `p` for format specification `"%hd"` must be `short`, not `char*`
+fail_compilation/chkformat.d(407): Deprecation: argument `p` for format specification `"%lu"` must be `$?:windows=uint|32=uint|64=ulong$`, not `char*`
+fail_compilation/chkformat.d(408): Deprecation: argument `p` for format specification `"%ld"` must be `$?:windows=int|32=int|64=long$`, not `char*`
+fail_compilation/chkformat.d(409): Deprecation: argument `p` for format specification `"%llu"` must be `ulong`, not `char*`
+fail_compilation/chkformat.d(410): Deprecation: argument `p` for format specification `"%lld"` must be `long`, not `char*`
+fail_compilation/chkformat.d(411): Deprecation: argument `p` for format specification `"%ju"` must be `core.stdc.stdint.uintmax_t`, not `char*`
+fail_compilation/chkformat.d(412): Deprecation: argument `p` for format specification `"%jd"` must be `core.stdc.stdint.intmax_t`, not `char*`
+---
+*/
+
+#line 400
+
+void test401() { char* p; printf("%u", p); }
+void test402() { char* p; printf("%d", p); }
+void test403() { char* p; printf("%hhu", p); }
+void test404() { char* p; printf("%hhd", p); }
+void test405() { char* p; printf("%hu", p); }
+void test406() { char* p; printf("%hd", p); }
+void test407() { char* p; printf("%lu", p); }
+void test408() { char* p; printf("%ld", p); }
+void test409() { char* p; printf("%llu", p); }
+void test410() { char* p; printf("%lld", p); }
+void test411() { char* p; printf("%ju", p); }
+void test412() { char* p; printf("%jd", p); }
diff --git a/gcc/testsuite/gdc.test/fail_compilation/enum_init.d b/gcc/testsuite/gdc.test/fail_compilation/enum_init.d
new file mode 100644
index 00000000000..ab6ba308550
--- /dev/null
+++ b/gcc/testsuite/gdc.test/fail_compilation/enum_init.d
@@ -0,0 +1,171 @@ 
+/*
+https://issues.dlang.org/show_bug.cgi?id=8511
+
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(5): Error: type `SQRTMAX` has no value
+---
+*/
+#line 1
+
+real hypot()
+{
+    enum SQRTMAX;
+    SQRTMAX/2;
+}
+
+/*
+https://issues.dlang.org/show_bug.cgi?id=21785
+
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(106): Error: enum `enum_init.NoBase` is opaque and has no default initializer
+---
+*/
+#line 100
+
+enum NoBase;
+
+void fooNB()
+{
+	NoBase nbv = void;
+	NoBase nb;
+}
+
+/*
+https://issues.dlang.org/show_bug.cgi?id=21785
+
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(206): Error: enum `enum_init.Xobj` is opaque and has no default initializer
+---
+*/
+#line 200
+
+enum Xobj : void*;
+
+void main()
+{
+	Xobj vv = void;
+	Xobj var;
+}
+
+
+/*
+https://issues.dlang.org/show_bug.cgi?id=21785
+
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(306): Error: variable `enum_init.fooOB.ob` no definition of struct `S`
+fail_compilation/enum_init.d(302):        required by type `OpaqueBase`
+---
+*/
+#line 300
+
+struct S;
+enum OpaqueBase : S;
+
+void fooOB()
+{
+	OpaqueBase ob;
+}
+
+/*
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(405): Error: enum `enum_init.forwardRef.Foo` forward reference of `Foo.init`
+---
+*/
+#line 400
+
+void forwardRef()
+{
+    enum Foo
+    {
+        a = Foo.init
+    }
+}
+
+/*
+https://issues.dlang.org/show_bug.cgi?id=21792
+
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(503): Error: circular reference to enum base type `Bar`
+---
+*/
+#line 500
+
+void forwardRef2()
+{
+    enum Bar : Bar
+    {
+        a
+    }
+}
+
+/*
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(606): Error: enum member `enum_init.forwardRef3.Foo.b` is forward referenced looking for `.min`
+fail_compilation/enum_init.d(607): Error: enum member `enum_init.forwardRef3.Foo.c` is forward referenced looking for `.min`
+---
+*/
+#line 600
+
+void forwardRef3()
+{
+    enum Foo
+    {
+        a,
+        b = Foo.min,
+        c
+    }
+}
+
+/*
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(711): Error: circular reference to enum base type `int[Bar.sizeof]`
+---
+*/
+#line 700
+
+void forwardRef4()
+{
+    enum Foo
+    {
+        a = Foo.sizeof,
+        c
+    }
+    // pragma(msg, typeof(Foo.sizeof));
+    // static assert(is(Foo Base == enum) && is(Base == int));
+
+    enum Bar : int[Bar.sizeof]
+    {
+        a
+    }
+}
+
+/*
+TEST_OUTPUT:
+---
+fail_compilation/enum_init.d(809): Error: enum `enum_init.opaqueProperties.Foo` is opaque and has no default initializer
+fail_compilation/enum_init.d(810): Error: enum `enum_init.opaqueProperties.Foo` is opaque and has no `.min`
+fail_compilation/enum_init.d(811): Error: enum `enum_init.opaqueProperties.Foo` is opaque and has no `.max`
+---
+*/
+#line 800
+
+void opaqueProperties()
+{
+    enum Foo;
+
+    // Valid
+    enum size = Foo.sizeof;
+    enum s = Foo.mangleof;
+
+    Foo f = Foo.init;
+    int min = Foo.min;
+    int max = Foo.max;
+}
diff --git a/gcc/testsuite/gdc.test/fail_compilation/fail109.d b/gcc/testsuite/gdc.test/fail_compilation/fail109.d
index 4fd53213385..3e379c3fbf0 100644
--- a/gcc/testsuite/gdc.test/fail_compilation/fail109.d
+++ b/gcc/testsuite/gdc.test/fail_compilation/fail109.d
@@ -53,10 +53,10 @@  enum B
 /* Bugzilla 11849
 TEST_OUTPUT:
 ---
-fail_compilation/fail109.d(72): Error: enum fail109.RegValueType1a recursive definition of `.max` property
-fail_compilation/fail109.d(79): Error: enum fail109.RegValueType1b recursive definition of `.max` property
-fail_compilation/fail109.d(84): Error: enum fail109.RegValueType2a recursive definition of `.min` property
-fail_compilation/fail109.d(91): Error: enum fail109.RegValueType2b recursive definition of `.min` property
+fail_compilation/fail109.d(72): Error: enum member `fail109.RegValueType1a.Unknown` is forward referenced looking for `.max`
+fail_compilation/fail109.d(79): Error: enum member `fail109.RegValueType1b.Unknown` is forward referenced looking for `.max`
+fail_compilation/fail109.d(84): Error: enum member `fail109.RegValueType2a.Unknown` is forward referenced looking for `.min`
+fail_compilation/fail109.d(91): Error: enum member `fail109.RegValueType2b.Unknown` is forward referenced looking for `.min`
 ---
 */
 
diff --git a/gcc/testsuite/gdc.test/fail_compilation/ice10770.d b/gcc/testsuite/gdc.test/fail_compilation/ice10770.d
deleted file mode 100644
index 5b0659a6b01..00000000000
--- a/gcc/testsuite/gdc.test/fail_compilation/ice10770.d
+++ /dev/null
@@ -1,13 +0,0 @@ 
-/*
-TEST_OUTPUT:
----
-fail_compilation/ice10770.d(13): Error: enum ice10770.E2 is forward referenced looking for base type
-fail_compilation/ice10770.d(13):        while evaluating: `static assert(is(E2 e == enum))`
----
-*/
-
-enum E1 : int;
-static assert(is(E1 e == enum) && is(e == int));
-
-enum E2;
-static assert(is(E2 e == enum));
diff --git a/gcc/testsuite/gdc.test/fail_compilation/ice8511.d b/gcc/testsuite/gdc.test/fail_compilation/ice8511.d
deleted file mode 100644
index 873f8965ec2..00000000000
--- a/gcc/testsuite/gdc.test/fail_compilation/ice8511.d
+++ /dev/null
@@ -1,13 +0,0 @@ 
-/*
-TEST_OUTPUT:
----
-fail_compilation/ice8511.d(11): Error: enum ice8511.hypot.SQRTMAX is forward referenced looking for base type
-fail_compilation/ice8511.d(12): Error: incompatible types for ((SQRTMAX) / (2)): cannot use '/' with types
----
-*/
-
-real hypot()
-{
-    enum SQRTMAX;
-    SQRTMAX/2;
-}
diff --git a/libphobos/libdruntime/MERGE b/libphobos/libdruntime/MERGE
index b797682a4d9..d839a08c19b 100644
--- a/libphobos/libdruntime/MERGE
+++ b/libphobos/libdruntime/MERGE
@@ -1,4 +1,4 @@ 
-483bc12977af3c1288fd52e7b4fa14b716896c5a
+1134b71039881464e9bf021836d82796b3a1fcfc
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/druntime repository.
diff --git a/libphobos/libdruntime/object.d b/libphobos/libdruntime/object.d
index c05643bf36d..e96d1c48563 100644
--- a/libphobos/libdruntime/object.d
+++ b/libphobos/libdruntime/object.d
@@ -42,7 +42,7 @@  else version (X86_64)
     else version (Windows) { /* no need for Win64 ABI */ }
     else version = WithArgTypes;
 }
-version (AArch64)
+else version (AArch64)
 {
     // Apple uses a trivial varargs implementation
     version (OSX) {}