Hello community,

here is the log from the commit of package dmd for openSUSE:Factory checked in 
at 2018-06-19 12:03:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/dmd (Old)
 and      /work/SRC/openSUSE:Factory/.dmd.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "dmd"

Tue Jun 19 12:03:22 2018 rev:16 rq:617146 version:2.080.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/dmd/dmd.changes  2018-05-13 16:04:57.790554895 
+0200
+++ /work/SRC/openSUSE:Factory/.dmd.new/dmd.changes     2018-06-19 
12:03:24.506600177 +0200
@@ -1,0 +2,20 @@
+Fri Jun  8 18:58:38 UTC 2018 - matthias.elias...@gmail.com
+
+- Update to 2.080.1
+  - DMD Compiler regressions
+    * [REG 2.073] object initializer omitted when it should be included.
+    * [REG2.078-b1] case where && is not shortcut anymore in CTFE
+    * DMD segfault when doing unsafe operation outside of any function
+  - DMD Compiler bugs
+    * static foreach segfaults on __traits(allMembers)
+    * Access violation when generating JSON on static foreach
+    * DMD compilation crash
+    * -lib crashes on static libraries in the command line
+  - Phobos regressions
+    * [REG 2.080.0] Compiling byGrapheme Fails
+    * DMD "illegal hardware instruction" crash
+    * getSymbolsByUDA fails on AliasSeq members
+  - Druntime bugs
+    * core.internal.string has issues with radix
+
+-------------------------------------------------------------------

Old:
----
  dmd-2.080.0.tar.gz
  druntime-2.080.0.tar.gz
  phobos-2.080.0.tar.gz

New:
----
  dmd-2.080.1.tar.gz
  druntime-2.080.1.tar.gz
  phobos-2.080.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ dmd.spec ++++++
--- /var/tmp/diff_new_pack.CcaqTL/_old  2018-06-19 12:03:26.054542703 +0200
+++ /var/tmp/diff_new_pack.CcaqTL/_new  2018-06-19 12:03:26.058542555 +0200
@@ -24,7 +24,7 @@
 %define auto_bootstrap 1
 %endif
 Name:           dmd
-Version:        2.080.0
+Version:        2.080.1
 Release:        0
 Summary:        D Programming Language 2.0
 License:        BSL-1.0
@@ -94,7 +94,7 @@
 %setup -q
 %setup -q -T -D -a 1
 %setup -q -T -D -a 2
-%patch0 -p0
+%patch0
 echo %{version} > phobos-%{version}/VERSION
 cd %{_builddir}
 ln -s dmd-%{version} dmd

++++++ dmd-2.080.0.tar.gz -> dmd-2.080.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/VERSION new/dmd-2.080.1/VERSION
--- old/dmd-2.080.0/VERSION     2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/VERSION     2018-06-07 17:24:58.000000000 +0200
@@ -1 +1 @@
-v2.080.0
+v2.080.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/deprecate_class_allocators.dd 
new/dmd-2.080.1/changelog/deprecate_class_allocators.dd
--- old/dmd-2.080.0/changelog/deprecate_class_allocators.dd     2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/deprecate_class_allocators.dd     1970-01-01 
01:00:00.000000000 +0100
@@ -1,50 +0,0 @@
-Class allocators and deallocators have been deprecated
-
-Class allocators and deallocators have been planned for deprecation for years. 
 Starting with this release the following code will emit deprecation messages.
-
----
-class C
-{
-    new(size_t size)         // deprecation message
-    {
-        return malloc(size);
-    }
-
-    delete(void* obj)        // deprecation message
-    {
-        free(obj);
-    }
-}
----
-
-See the $(LINK2 
$(ROOT_DIR)deprecate.html#Class%20allocators%20and%20deallocators, Deprecated 
Features) for more information.
-
-Many alternatives for class allocators/deallcators exist. Among them is the 
generic $(REF make, std,experimental,allocator) and $(REF dispose, 
std,experimental,allocator) from the allocator package. For other alternatives, 
see $(LINK2 https://dlang.org/blog/the-gc-series, the recent article about 
memory allocation on the DBlog) and $(LINK2 
https://wiki.dlang.org/Memory_Management, the D Wiki memory management article).
-
-Users have leveraged allocators in order to disable GC allocation, as 
illustrated in the following example:
-
----
-class C
-{
-    @disable new(size_t size);
-}
-
-void main()
-{
-    auto c = new C();  // Error: allocator `new` is not callable because it is 
annotated with `@disable`
-}
----
-
-That idiom will remain, but has been enhanced with this release to no longer 
require the `size_t` argument.  That is, starting with this release, the 
following syntax is also permitted:
-
----
-class C
-{
-    @disable new();
-}
-
-void main()
-{
-    auto c = new C();  // Error: allocator `new` is not callable because it is 
annotated with `@disable`
-}
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/dmd-2.080.0/changelog/deprecate_double_initialization.dd 
new/dmd-2.080.1/changelog/deprecate_double_initialization.dd
--- old/dmd-2.080.0/changelog/deprecate_double_initialization.dd        
2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/deprecate_double_initialization.dd        
1970-01-01 01:00:00.000000000 +0100
@@ -1,47 +0,0 @@
-Deprecate double initialization of immutable fields inside constructor
-
-Inside a constructor scope, assigning to aggregate declaration (class/struct)
-members is done by considering the first assignment as initialization and
-subsequent assignments as modifications of the initially constructed object.
-For `const`/`immutable` fields the initialization is accepted in the 
constructor,
-but subsequent modifications are not. Example:
-
----
-struct A
-{
-    int a;
-    immutable int b;
-    this(int a, int b)
-    {
-        this.a = a;
-        this.b = b;
-
-        this.a = 7; // OK, a is mutable
-        this.b = 9; // Error: immutable field b initialized multiple times
-    }
-}
----
-
-However, $(BUGZILLA 18719) shows that this rule does not apply when inside
-a constructor scope there is a call to a different constructor:
-
----
-struct A
-{
-    immmutable int a;
-    this()
-    {
-        this(42);
-        this.a = 5;  // second initialization of immutable field
-    }
-
-    this(int a)
-    {
-        this.a = a;
-    }
-}
----
-
-The above code wrongfully compiled succesfully before this patch, accepting 
the double
-initialization of the `immutable` field `a`. After this patch, `this.a = 5` 
will issue
-a deprecation warning stating that `a` is initialized multiple times.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/fix18736.dd 
new/dmd-2.080.1/changelog/fix18736.dd
--- old/dmd-2.080.0/changelog/fix18736.dd       2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/changelog/fix18736.dd       1970-01-01 01:00:00.000000000 
+0100
@@ -1,25 +0,0 @@
-Issue 18736 - constructor calls allowed after case labels
-
-Delegating constructor calls are not allowed after labels,
-but case labels and default labels should also count as labels.
-
----
-class A
-{
-    this(char c) { }
-
-    this(int i)
-    {
-        switch (i)
-        {
-            case 1:  break;
-            default: break;
-        }
-        this('c'); // now gives an error
-    }
-}
----
-
-This is necessary so the compiler can guarantee that each
-field is initialized exactly once. To get code like the above
-to pass the compiler, replace it with an if-then sequence.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/fix5227.dd 
new/dmd-2.080.1/changelog/fix5227.dd
--- old/dmd-2.080.0/changelog/fix5227.dd        2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/changelog/fix5227.dd        1970-01-01 01:00:00.000000000 
+0100
@@ -1,20 +0,0 @@
-fix Issue 5227 - X ^^ FP at compile-time
-
-The pow operator `^^` can now be used by CTFE.
-
-Adds these std.math functions to those that can be used by CTFE:
-
-round
-floor
-ceil
-trunc
-log
-log2
-log10
-pow
-expm1
-exp2
-fmin
-fmax
-copysign
-fma
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/isReturnOnStack.dd 
new/dmd-2.080.1/changelog/isReturnOnStack.dd
--- old/dmd-2.080.0/changelog/isReturnOnStack.dd        2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/isReturnOnStack.dd        1970-01-01 
01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-add __traits(isReturnOnStack, func)
-
-Determines if a function's return value is placed on the stack,
-or is returned via registers.
-For more details, see $(LINK2 $(ROOT_DIR)spec/traits.html#isReturnOnStack, 
isReturnOnStack). 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/objc_class_methods.dd 
new/dmd-2.080.1/changelog/objc_class_methods.dd
--- old/dmd-2.080.0/changelog/objc_class_methods.dd     2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/objc_class_methods.dd     1970-01-01 
01:00:00.000000000 +0100
@@ -1,45 +0,0 @@
-Support for calling Objective-C class (static) methods has been added.
-
-Previously to call an Objective-C class method it was necessary to make 
explicit
-calls to the Objective-C runtime. The following code is an example of the old
-way to call a class method:
-
----
-extern (C) Class objc_lookUpClass(in char* name);
-
-extern (Objective-C)
-interface Class
-{
-    NSObject alloc() @selector("alloc");
-}
-
-extern (Objective-C)
-interface NSObject
-{
-    NSObject init() @selector("init");
-}
-
-void main()
-{
-    auto cls = objc_lookUpClass("NSObject");
-    auto o = cls.alloc().init();
-}
----
-
-The above code can now be replaced with the following:
-
----
-extern (Objective-C)
-interface NSObject
-{
-    static NSObject alloc() @selector("alloc");
-    NSObject init() @selector("init");
-}
-
-void main()
-{
-    auto o = NSObject.alloc().init();
-}
----
-
-Note the use of the `static` attribute in the method declaration.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/postblitQualifiers.dd 
new/dmd-2.080.1/changelog/postblitQualifiers.dd
--- old/dmd-2.080.0/changelog/postblitQualifiers.dd     2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/postblitQualifiers.dd     1970-01-01 
01:00:00.000000000 +0100
@@ -1,28 +0,0 @@
-Deprecate the use of a `const`/`immutable`/`shared` postblit
-
-Before this patch, if a postblit was declared `const`/`immutable`/`shared`
-the compiler would have accepted the declaration but there would have
-been no way of calling the postblit succesfully, except for const due
-to the implicit conversion mutable -> const. Even though calling a
-const posblit is possible, there is no way to modify the fields of the
-newly copied struct:
-
----
-struct S
-{
-    int n
-    this(this) const
-    {
-        ++n;   // Error: cannot modify this.n in const method
-    }
-}
-
-void main()
-{
-    S a;
-    auto a2 = a;
-}
----
-
-With this release, if a postblit contains `const`/`immutable`/`shared` in
-its signature, a deprecation message will be emitted.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/rwm-shared-error.dd 
new/dmd-2.080.1/changelog/rwm-shared-error.dd
--- old/dmd-2.080.0/changelog/rwm-shared-error.dd       2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/rwm-shared-error.dd       1970-01-01 
01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-The deprecation for read-modify-write operations on `shared` variables has 
ended
-
-Read-modify-write operations are not allowed for `shared` variables:
-
----
-shared int i;
-i++; // Error: read-modify-write operations are not allowed for shared 
variables
----
-
-Use $(REF atomicOp, core, atomic) instead:
-
----
-import core.atomic : atomicOp;
-shared int i;
-atomicOp!"+="(i, 1);
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/changelog/switch-skip-declaration.dd 
new/dmd-2.080.1/changelog/switch-skip-declaration.dd
--- old/dmd-2.080.0/changelog/switch-skip-declaration.dd        2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/changelog/switch-skip-declaration.dd        1970-01-01 
01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-The deprecation for `switch` cases which skip the declaration of a variable 
has ended
-
-Usage of a variable which is declared in another `switch` case now results in 
an error.
-
----
-int i = 2;
-switch (i)
-{
-    case 1:
-    {
-        int j;
-    case 2:
-        j++;
-        j.writeln; // BUG: j is not initialized and e.g. prints -321532879
-        break;
-    }
-    default:
-        break;
-}
----
-
-If this behavior is wanted, it can explicitly requested by using `void` 
initialization:
-
----
-int i = 2;
-switch (i)
-{
-    case 1:
-    {
-        int j = void;
-    case 2:
-        j = 2;
-        j.writeln;
-        break;
-    }
-    default:
-        break;
-}
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/attrib.d 
new/dmd-2.080.1/src/dmd/attrib.d
--- old/dmd-2.080.0/src/dmd/attrib.d    2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/attrib.d    2018-06-07 17:24:58.000000000 +0200
@@ -928,7 +928,8 @@
 extern (C++) final class StaticIfDeclaration : ConditionalDeclaration
 {
     ScopeDsymbol scopesym;
-    bool addisdone;
+    private bool addisdone = false; // true if members have been added to scope
+    private bool onStack = false;   // true if a call to `include` is 
currently active
 
     extern (D) this(Condition condition, Dsymbols* decl, Dsymbols* elsedecl)
     {
@@ -950,8 +951,10 @@
     {
         //printf("StaticIfDeclaration::include(sc = %p) scope = %p\n", sc, 
scope);
 
-        if (errors)
+        if (errors || onStack)
             return null;
+        onStack = true;
+        scope(exit) onStack = false;
 
         if (condition.inc == 0)
         {
@@ -1039,6 +1042,7 @@
      of the first call.  We need both `cached` and `cache`, because
      `null` is a valid value for `cache`.
      +/
+    bool onStack = false;
     bool cached = false;
     Dsymbols* cache = null;
 
@@ -1073,14 +1077,20 @@
 
     override Dsymbols* include(Scope* sc)
     {
-        if (errors)
+        if (errors || onStack)
             return null;
-
         if (cached)
         {
+            assert(!onStack);
             return cache;
         }
-        sfe.prepare(_scope); // lower static foreach aggregate
+        onStack = true;
+        scope(exit) onStack = false;
+
+        if (_scope)
+        {
+            sfe.prepare(_scope); // lower static foreach aggregate
+        }
         if (!sfe.ready())
         {
             return null; // TODO: ok?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/attrib.h 
new/dmd-2.080.1/src/dmd/attrib.h
--- old/dmd-2.080.0/src/dmd/attrib.h    2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/attrib.h    2018-06-07 17:24:58.000000000 +0200
@@ -178,6 +178,7 @@
 public:
     ScopeDsymbol *scopesym;
     bool addisdone;
+    bool onStack;
 
     Dsymbol *syntaxCopy(Dsymbol *s);
     Dsymbols *include(Scope *sc);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/clone.d 
new/dmd-2.080.1/src/dmd/clone.d
--- old/dmd-2.080.0/src/dmd/clone.d     2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/clone.d     2018-06-07 17:24:58.000000000 +0200
@@ -765,7 +765,11 @@
     const(char)* code =
         "size_t h = 0;" ~
         "foreach (i, T; typeof(p.tupleof))" ~
-        "    h = h * 33 + typeid(T).getHash(cast(const void*)&p.tupleof[i]);" ~
+        // workaround https://issues.dlang.org/show_bug.cgi?id=17968
+        "    static if(is(T* : const(Object)*)) " ~
+        "        h = h * 33 + typeid(const(Object)).getHash(cast(const 
void*)&p.tupleof[i]);" ~
+        "    else " ~
+        "        h = h * 33 + typeid(T).getHash(cast(const 
void*)&p.tupleof[i]);" ~
         "return h;";
     fop.fbody = new CompileStatement(loc, new StringExp(loc, cast(char*)code));
     Scope* sc2 = sc.push();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/cond.d 
new/dmd-2.080.1/src/dmd/cond.d
--- old/dmd-2.080.0/src/dmd/cond.d      2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/cond.d      2018-06-07 17:24:58.000000000 +0200
@@ -416,7 +416,7 @@
      */
     final extern(D) bool ready()
     {
-        return aggrfe && aggrfe.aggr && aggrfe.aggr.type.toBasetype().ty == 
Ttuple;
+        return aggrfe && aggrfe.aggr && aggrfe.aggr.type && 
aggrfe.aggr.type.toBasetype().ty == Ttuple;
     }
 }
 
@@ -816,7 +816,6 @@
 extern (C++) final class StaticIfCondition : Condition
 {
     Expression exp;
-    int nest;           // limit circular dependencies
 
     extern (D) this(const ref Loc loc, Expression exp)
     {
@@ -842,11 +841,6 @@
 
         if (inc == 0)
         {
-            if (exp.op == TOK.error || nest > 100)
-            {
-                error(loc, (nest > 1000) ? "unresolvable circular `static if` 
expression" : "error evaluating `static if` expression");
-                return errorReturn();
-            }
             if (!sc)
             {
                 error(loc, "`static if` conditional cannot be at global 
scope");
@@ -854,14 +848,12 @@
                 return 0;
             }
 
-            ++nest;
             sc = sc.push(sc.scopesym);
 
             import dmd.staticcond;
             bool errors;
             bool result = evalStaticCondition(sc, exp, exp, errors);
             sc.pop();
-            --nest;
             // Prevent repeated condition evaluation.
             // See: fail_compilation/fail7815.d
             if (inc != 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/constfold.d 
new/dmd-2.080.1/src/dmd/constfold.d
--- old/dmd-2.080.0/src/dmd/constfold.d 2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/constfold.d 2018-06-07 17:24:58.000000000 +0200
@@ -1339,8 +1339,11 @@
         uinteger_t iupr = upr.toInteger();
         if (iupr > es1.len || ilwr > iupr)
         {
-            e1.error("string slice `[%llu .. %llu]` is out of bounds", ilwr, 
iupr);
-            emplaceExp!(ErrorExp)(&ue);
+            // https://issues.dlang.org/show_bug.cgi?id=18115
+            emplaceExp!(CTFEExp)(&ue, TOK.cantExpression);
+            return ue;
+            //e1.error("string slice `[%llu .. %llu]` is out of bounds", ilwr, 
iupr);
+            //emplaceExp!(ErrorExp)(&ue);
         }
         else
         {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/dinterpret.d 
new/dmd-2.080.1/src/dmd/dinterpret.d
--- old/dmd-2.080.0/src/dmd/dinterpret.d        2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/src/dmd/dinterpret.d        2018-06-07 17:24:58.000000000 
+0200
@@ -4827,17 +4827,23 @@
             {
                 assert(e.arguments.dim == 1);
                 Expression ea = (*e.arguments)[0];
-                //printf("1 ea = %s %s\n", ea.type.toChars(), ea.toChars());
+                // printf("1 ea = %s %s\n", ea.type.toChars(), ea.toChars());
                 if (ea.op == TOK.slice)
                     ea = (cast(SliceExp)ea).e1;
                 if (ea.op == TOK.cast_)
                     ea = (cast(CastExp)ea).e1;
 
-                //printf("2 ea = %s, %s %s\n", ea.type.toChars(), 
Token::toChars(ea.op), ea.toChars());
+                // printf("2 ea = %s, %s %s\n", ea.type.toChars(), 
Token.toChars(ea.op), ea.toChars());
                 if (ea.op == TOK.variable || ea.op == TOK.symbolOffset)
                     result = getVarExp(e.loc, istate, (cast(SymbolExp)ea).var, 
ctfeNeedRvalue);
                 else if (ea.op == TOK.address)
                     result = interpret((cast(AddrExp)ea).e1, istate);
+
+                // https://issues.dlang.org/show_bug.cgi?id=18871
+                // https://issues.dlang.org/show_bug.cgi?id=18819
+                else if (ea.op == TOK.arrayLiteral)
+                    result = interpret(cast(ArrayLiteralExp)ea, istate);
+
                 else
                     assert(0);
                 if (CTFEExp.isCantExp(result))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/dstruct.d 
new/dmd-2.080.1/src/dmd/dstruct.d
--- old/dmd-2.080.0/src/dmd/dstruct.d   2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/dstruct.d   2018-06-07 17:24:58.000000000 +0200
@@ -484,7 +484,7 @@
             {
                 if ((stype.alignment() < Target.ptrsize ||
                      (v.offset & (Target.ptrsize - 1))) &&
-                    sc.func.setUnsafe())
+                    (sc.func && sc.func.setUnsafe()))
                 {
                     .error(loc, "field `%s.%s` cannot assign to misaligned 
pointers in `@safe` code",
                         toChars(), v.toChars());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/expression.d 
new/dmd-2.080.1/src/dmd/expression.d
--- old/dmd-2.080.0/src/dmd/expression.d        2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/src/dmd/expression.d        2018-06-07 17:24:58.000000000 
+0200
@@ -2119,7 +2119,7 @@
 
         if (v.type.ty == Tstruct)
         {
-            StructDeclaration sd = (cast(TypeStruct)type).sym;
+            StructDeclaration sd = (cast(TypeStruct)v.type).sym;
             if (sd.hasNoFields)
                 return false;
         }
@@ -2560,6 +2560,11 @@
     {
         return new IntegerExp(loc, value, type);
     }
+
+    static IntegerExp createi(Loc loc, int value, Type type)
+    {
+        return new IntegerExp(loc, value, type);
+    }
 
     override bool equals(RootObject o)
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/expression.h 
new/dmd-2.080.1/src/dmd/expression.h
--- old/dmd-2.080.0/src/dmd/expression.h        2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/src/dmd/expression.h        2018-06-07 17:24:58.000000000 
+0200
@@ -226,6 +226,7 @@
     dinteger_t value;
 
     static IntegerExp *create(Loc loc, dinteger_t value, Type *type);
+    static IntegerExp *createi(Loc loc, int value, Type *type);
     bool equals(RootObject *o);
     dinteger_t toInteger();
     real_t toReal();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/func.d 
new/dmd-2.080.1/src/dmd/func.d
--- old/dmd-2.080.0/src/dmd/func.d      2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/func.d      2018-06-07 17:24:58.000000000 +0200
@@ -2197,7 +2197,7 @@
      */
     static FuncDeclaration genCfunc(Parameters* fparams, Type treturn, 
const(char)* name, StorageClass stc = 0)
     {
-        return genCfunc(fparams, treturn, Identifier.idPool(name, 
strlen(name)), stc);
+        return genCfunc(fparams, treturn, Identifier.idPool(name, 
cast(uint)strlen(name)), stc);
     }
 
     static FuncDeclaration genCfunc(Parameters* fparams, Type treturn, 
Identifier id, StorageClass stc = 0)
@@ -2570,9 +2570,8 @@
 
     Match m;
     m.last = MATCH.nomatch;
-
-    const(char)* failMessage;
-    functionResolve(&m, s, loc, sc, tiargs, tthis, fargs, &failMessage);
+    functionResolve(&m, s, loc, sc, tiargs, tthis, fargs, null);
+    auto orig_s = s;
 
     if (m.last > MATCH.nomatch && m.lastf)
     {
@@ -2699,6 +2698,9 @@
                     .error(loc, "%s `%s%s%s` is not callable using argument 
types `%s`",
                         fd.kind(), fd.toPrettyChars(), 
parametersTypeToChars(tf.parameters, tf.varargs),
                         tf.modToChars(), fargsBuf.peekString());
+                    // re-resolve to check for supplemental message
+                    const(char)* failMessage;
+                    functionResolve(&m, orig_s, loc, sc, tiargs, tthis, fargs, 
&failMessage);
                     if (failMessage)
                         errorSupplemental(loc, failMessage);
                 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/identifier.d 
new/dmd-2.080.1/src/dmd/identifier.d
--- old/dmd-2.080.0/src/dmd/identifier.d        2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/src/dmd/identifier.d        2018-06-07 17:24:58.000000000 
+0200
@@ -143,10 +143,10 @@
      */
     extern (D) static Identifier idPool(const(char)[] s)
     {
-        return idPool(s.ptr, s.length);
+        return idPool(s.ptr, cast(uint)s.length);
     }
 
-    static Identifier idPool(const(char)* s, size_t len)
+    static Identifier idPool(const(char)* s, uint len)
     {
         StringValue* sv = stringtable.update(s, len);
         Identifier id = cast(Identifier)sv.ptrvalue;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/identifier.h 
new/dmd-2.080.1/src/dmd/identifier.h
--- old/dmd-2.080.0/src/dmd/identifier.h        2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/src/dmd/identifier.h        2018-06-07 17:24:58.000000000 
+0200
@@ -16,6 +16,7 @@
 #endif /* __DMC__ */
 
 #include "root.h"
+#include "rmem.h"
 #include "stringtable.h"
 
 class Identifier : public RootObject
@@ -38,7 +39,7 @@
     static StringTable stringtable;
     static Identifier *generateId(const char *prefix);
     static Identifier *generateId(const char *prefix, size_t i);
-    static Identifier *idPool(const char *s, size_t len);
+    static Identifier *idPool(const char *s, unsigned len);
 
     static inline Identifier *idPool(const char *s)
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/initsem.d 
new/dmd-2.080.1/src/dmd/initsem.d
--- old/dmd-2.080.0/src/dmd/initsem.d   2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/initsem.d   2018-06-07 17:24:58.000000000 +0200
@@ -12,6 +12,7 @@
 
 module dmd.initsem;
 
+import core.stdc.stdio;
 import core.checkedint;
 
 import dmd.aggregate;
@@ -192,7 +193,7 @@
                 {
                     if ((t.alignment() < Target.ptrsize ||
                          (vd.offset & (Target.ptrsize - 1))) &&
-                        sc.func.setUnsafe())
+                        sc.func && sc.func.setUnsafe())
                     {
                         error(i.loc, "field `%s.%s` cannot assign to 
misaligned pointers in `@safe` code",
                             sd.toChars(), vd.toChars());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/lexer.d 
new/dmd-2.080.1/src/dmd/lexer.d
--- old/dmd-2.080.0/src/dmd/lexer.d     2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/lexer.d     2018-06-07 17:24:58.000000000 +0200
@@ -494,7 +494,7 @@
                         }
                         break;
                     }
-                    Identifier id = Identifier.idPool(cast(char*)t.ptr, p - 
t.ptr);
+                    Identifier id = Identifier.idPool(cast(char*)t.ptr, 
cast(uint)(p - t.ptr));
                     t.ident = id;
                     t.value = cast(TOK)id.getValue();
                     anyToken = 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/mars.d 
new/dmd-2.080.1/src/dmd/mars.d
--- old/dmd-2.080.0/src/dmd/mars.d      2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/mars.d      2018-06-07 17:24:58.000000000 +0200
@@ -666,7 +666,7 @@
         /* At this point, name is the D source file name stripped of
          * its path and extension.
          */
-        auto id = Identifier.idPool(name, strlen(name));
+        auto id = Identifier.idPool(name, cast(uint)strlen(name));
         auto m = new Module(files[i], id, global.params.doDocComments, 
global.params.doHdrGeneration);
         modules.push(m);
         if (firstmodule)
@@ -890,6 +890,11 @@
     Library library = null;
     if (global.params.lib)
     {
+        if (global.params.objfiles.dim == 0)
+        {
+            error(Loc.initial, "no input files");
+            return EXIT_FAILURE;
+        }
         library = Library.factory();
         library.setFilename(global.params.objdir, global.params.libname);
         // Add input object and input library files to output library
@@ -2479,7 +2484,7 @@
                 if (*modulePattern == '.')
                 {
                     assert(modulePattern > idStart, "empty module pattern");
-                    *dst = MatcherNode(Identifier.idPool(idStart, 
modulePattern - idStart));
+                    *dst = MatcherNode(Identifier.idPool(idStart, 
cast(uint)(modulePattern - idStart)));
                     modulePattern++;
                     idStart = modulePattern;
                     break;
@@ -2491,7 +2496,7 @@
             if (*modulePattern == '\0')
             {
                 assert(modulePattern > idStart, "empty module pattern");
-                *lastNode = MatcherNode(Identifier.idPool(idStart, 
modulePattern - idStart));
+                *lastNode = MatcherNode(Identifier.idPool(idStart, 
cast(uint)(modulePattern - idStart)));
                 break;
             }
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/dmd/mtype.d 
new/dmd-2.080.1/src/dmd/mtype.d
--- old/dmd-2.080.0/src/dmd/mtype.d     2018-05-01 15:42:29.000000000 +0200
+++ new/dmd-2.080.1/src/dmd/mtype.d     2018-06-07 17:24:58.000000000 +0200
@@ -4782,6 +4782,8 @@
     // arguments get specially formatted
     private const(char)* getParamError(const(char)* format, Expression arg, 
Parameter par)
     {
+        if (global.gag && !global.params.showGaggedErrors)
+            return null;
         // show qualification when toChars() is the same but types are 
different
         auto at = arg.type.toChars();
         bool qual = !arg.type.equals(par.type) && strcmp(at, 
par.type.toChars()) == 0;
@@ -5627,7 +5629,7 @@
             /* Look for what user might have intended
              */
             const p = mutableOf().unSharedOf().toChars();
-            auto id = Identifier.idPool(p, strlen(p));
+            auto id = Identifier.idPool(p, cast(uint)strlen(p));
             if (const n = importHint(p))
                 error(loc, "`%s` is not defined, perhaps `import %s;` ?", p, 
n);
             else if (auto s2 = sc.search_correct(id))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/src/tests/cxxfrontend.c 
new/dmd-2.080.1/src/tests/cxxfrontend.c
--- old/dmd-2.080.0/src/tests/cxxfrontend.c     2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/src/tests/cxxfrontend.c     2018-06-07 17:24:58.000000000 
+0200
@@ -154,7 +154,7 @@
     Loc loc;
     Identifier *ident = Identifier::idPool("test");
 
-    IntegerExp *ie = IntegerExp::create(loc, 42, Type::tint32);
+    IntegerExp *ie = IntegerExp::createi(loc, 42, Type::tint32);
     ie->accept(&tv);
     assert(tv.expr == true);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/extra-files/json.out 
new/dmd-2.080.1/test/compilable/extra-files/json.out
--- old/dmd-2.080.0/test/compilable/extra-files/json.out        2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/test/compilable/extra-files/json.out        2018-06-07 
17:24:58.000000000 +0200
@@ -923,6 +923,20 @@
                 "line": 194,
                 "linkage": "objc",
                 "name": "flinkageObjc"
+            },
+            {
+                "char": 7,
+                "kind": "template",
+                "line": 196,
+                "members": [],
+                "name": "test18211",
+                "parameters": [
+                    {
+                        "deco": "VALUE_REMOVED_FOR_TEST",
+                        "kind": "value",
+                        "name": "n"
+                    }
+                ]
             }
         ],
         "name": "json"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/json.d 
new/dmd-2.080.1/test/compilable/json.d
--- old/dmd-2.080.0/test/compilable/json.d      2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/test/compilable/json.d      2018-06-07 17:24:58.000000000 
+0200
@@ -192,3 +192,12 @@
 extern(Windows) int flinkageWindows();
 extern(Pascal) int flinkagePascal();
 extern(Objective-C) int flinkageObjc();
+
+mixin template test18211(int n)
+{
+    static foreach (i; 0 .. n>10 ? 10 : n)
+    {
+        mixin("enum x" ~ cast(char)('0' + i));
+    }
+    static if (true) {}
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test11169.d 
new/dmd-2.080.1/test/compilable/test11169.d
--- old/dmd-2.080.0/test/compilable/test11169.d 2018-05-01 15:42:29.000000000 
+0200
+++ new/dmd-2.080.1/test/compilable/test11169.d 2018-06-07 17:24:58.000000000 
+0200
@@ -43,3 +43,18 @@
     static assert(!__traits(compiles, { auto b = new B2(); }));
     static assert(!__traits(compiles, { auto b = new B3(); }));
 }
+
+class B : A
+{
+    // __traits(isAbstractClass) is not usable in static if condition.
+       static assert (!__traits(isAbstractClass, typeof(this)));
+
+    override void foo()
+    {
+    }
+}
+
+void main2()
+{
+    B b = new B();
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test17819.d 
new/dmd-2.080.1/test/compilable/test17819.d
--- old/dmd-2.080.0/test/compilable/test17819.d 1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/compilable/test17819.d 2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,19 @@
+static if (__traits(allMembers, __traits(parent,{}))[0]=="object") {
+       pragma(msg, "compiled in!");
+       enum test = 0;
+}
+
+static foreach (m; __traits(allMembers, __traits(parent,{}))) {
+       pragma(msg, m.stringof);
+       mixin("enum new"~m~"=`"~m~"`;");
+}
+
+static assert([__traits(allMembers, __traits(parent,{}))] == ["object", 
"test", "newobject", "newWorld", "newBuildStuff", "World", "BuildStuff"]);
+
+struct World {
+       mixin BuildStuff;
+}
+
+template BuildStuff() {
+       static foreach(elem; __traits(allMembers, typeof(this))) {}
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test18115.d 
new/dmd-2.080.1/test/compilable/test18115.d
--- old/dmd-2.080.0/test/compilable/test18115.d 1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/compilable/test18115.d 2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,10 @@
+// https://issues.dlang.org/show_bug.cgi?id=18115
+
+int test()
+{
+    if (test.stringof.length > 6 &&
+        test.stringof[$-7..$] == "1234567") {}
+    return 0;
+}
+
+enum a = test();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test18821.d 
new/dmd-2.080.1/test/compilable/test18821.d
--- old/dmd-2.080.0/test/compilable/test18821.d 1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/compilable/test18821.d 2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,10 @@
+// https://issues.dlang.org/show_bug.cgi?id=18821
+
+align(1) struct epoll_event
+{
+    void* ptr;
+}
+template isAllZeroBits(epoll_event value) {}
+alias isInitAllZeroBits = isAllZeroBits!(epoll_event.init);
+
+epoll_event e = { null };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test18871.d 
new/dmd-2.080.1/test/compilable/test18871.d
--- old/dmd-2.080.0/test/compilable/test18871.d 1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/compilable/test18871.d 2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,15 @@
+// https://issues.dlang.org/show_bug.cgi?id=18871
+// and https://issues.dlang.org/show_bug.cgi?id=18819
+
+struct Problem
+{
+    ~this() {}
+}
+struct S
+{
+    Problem[1] payload;
+}
+enum theTemplateB = {
+    static foreach (e; S.init.tupleof) {}
+    return true;
+}();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test7815.d 
new/dmd-2.080.1/test/compilable/test7815.d
--- old/dmd-2.080.0/test/compilable/test7815.d  1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/compilable/test7815.d  2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,65 @@
+// REQUIRED_ARGS: -o-
+/*
+TEST_OUTPUT:
+---
+---
+*/
+
+mixin template Helpers()
+{
+    static if (is(Flags!Move))
+    {
+        Flags!Move flags;
+    }
+    else
+    {
+        pragma(msg, "X: ", __traits(derivedMembers, Flags!Move));
+    }
+}
+
+template Flags(T)
+{
+    mixin({
+        int defs = 1;
+        foreach (name; __traits(derivedMembers, Move))
+        {
+            defs++;
+        }
+        if (defs)
+        {
+            return "struct Flags { bool x; }";
+        }
+        else
+        {
+            return "";
+        }
+    }());
+}
+
+struct Move
+{
+    int a;
+    mixin Helpers!();
+}
+
+enum a7815 = Move.init.flags;
+
+/+
+This originally was an invalid case:
+When the Move struct member is analyzed:
+1. mixin Helpers!() is instantiated.
+2. In Helpers!(), static if and its condition is(Flags!Move)) evaluated.
+3. In Flags!Move, string mixin evaluates and CTFE lambda.
+4. __traits(derivedMembers, Move) tries to see the member of Move.
+   4a. mixin Helpers!() member is analyzed.
+   4b. `static if (is(Flags!Move))` in Helpers!() is evaluated
+   4c. The Flags!Move instantiation is already in progress, so it cannot be 
resolved.
+   4d. `static if` fails because Flags!Move cannot be determined as a type.
+5. __traits(derivedMembers, Move) returns a 1-length tuple("a").
+6. The lambda in Flags!Move returns a string "struct Flags {...}", then
+   Flags!Move is instantiated to a new struct Flags.
+7. Finally Move struct does not have flags member, then the `enum a7815`
+   definition will fail in its initializer.
+
+Now, static if will behave like a string mixin: it is invisible during its own 
expansion.
++/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test7886.d 
new/dmd-2.080.1/test/compilable/test7886.d
--- old/dmd-2.080.0/test/compilable/test7886.d  1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/compilable/test7886.d  2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,5 @@
+// 7886
+
+struct A {
+       static assert (__traits(derivedMembers, A).length == 0);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/fail_compilation/fail11169.d 
new/dmd-2.080.1/test/fail_compilation/fail11169.d
--- old/dmd-2.080.0/test/fail_compilation/fail11169.d   2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/test/fail_compilation/fail11169.d   1970-01-01 
01:00:00.000000000 +0100
@@ -1,28 +0,0 @@
-/*
-TEST_OUTPUT:
----
-fail_compilation/fail11169.d(16): Error: error evaluating `static if` 
expression
----
-*/
-
-class A
-{
-    abstract void foo();
-}
-
-class B : A
-{
-    // __traits(isAbstractClass) is not usable in static if condition.
-    static if (__traits(isAbstractClass, typeof(this)))
-    {
-    }
-
-    override void foo()
-    {
-    }
-}
-
-void main()
-{
-    B b = new B();
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/fail_compilation/fail7815.d 
new/dmd-2.080.1/test/fail_compilation/fail7815.d
--- old/dmd-2.080.0/test/fail_compilation/fail7815.d    2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/test/fail_compilation/fail7815.d    1970-01-01 
01:00:00.000000000 +0100
@@ -1,65 +0,0 @@
-// REQUIRED_ARGS: -o-
-/*
-TEST_OUTPUT:
----
-X: tuple("x")
-fail_compilation/fail7815.d(47): Error: no property `flags` for type `Move`
----
-*/
-
-mixin template Helpers()
-{
-    static if (is(Flags!Move))
-    {
-        Flags!Move flags;
-    }
-    else
-    {
-        pragma(msg, "X: ", __traits(derivedMembers, Flags!Move));
-    }
-}
-
-template Flags(T)
-{
-    mixin({
-        int defs = 1;
-        foreach (name; __traits(derivedMembers, Move))
-        {
-            defs++;
-        }
-        if (defs)
-        {
-            return "struct Flags { bool x; }";
-        }
-        else
-        {
-            return "";
-        }
-    }());
-}
-
-struct Move
-{
-    int a;
-    mixin Helpers!();
-}
-
-enum a7815 = Move.init.flags;
-
-/+
-This is an invalid case.
-When the Move struct member is analyzed:
-1. mixin Helpers!() is instantiated.
-2. In Helpers!(), static if and its condition is(Flags!Move)) evaluated.
-3. In Flags!Move, string mixin evaluates and CTFE lambda.
-4. __traits(derivedMembers, Move) tries to see the member of Move.
-   4a. mixin Helpers!() member is analyzed.
-   4b. `static if (is(Flags!Move))` in Helpers!() is evaluated
-   4c. The Flags!Move instantiation is already in progress, so it cannot be 
resolved.
-   4d. `static if` fails because Flags!Move cannot be determined as a type.
-5. __traits(derivedMembers, Move) returns a 1-length tuple("a").
-6. The lambda in Flags!Move returns a string "struct Flags {...}", then
-   Flags!Move is instantiated to a new struct Flags.
-7. Finally Move struct does not have flags member, then the `enum a7815`
-   definition will fail in its initializer.
-+/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/fail_compilation/fail7886.d 
new/dmd-2.080.1/test/fail_compilation/fail7886.d
--- old/dmd-2.080.0/test/fail_compilation/fail7886.d    2018-05-01 
15:42:29.000000000 +0200
+++ new/dmd-2.080.1/test/fail_compilation/fail7886.d    1970-01-01 
01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-// 7886
-
-struct A {
-  static if (__traits(derivedMembers, A).length) {}
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/runnable/extra-files/test17968.d 
new/dmd-2.080.1/test/runnable/extra-files/test17968.d
--- old/dmd-2.080.0/test/runnable/extra-files/test17968.d       1970-01-01 
01:00:00.000000000 +0100
+++ new/dmd-2.080.1/test/runnable/extra-files/test17968.d       2018-06-07 
17:24:58.000000000 +0200
@@ -0,0 +1,12 @@
+import test17968a;
+
+void main()
+{
+    auto r = fun2.fun1;
+    // just check that getHash works (doesn't throw).
+    typeid(r).getHash(&r);
+
+    // try gethash when member is null.
+    r.t = null;
+    typeid(r).getHash(&r);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/runnable/extra-files/test17968a.d 
new/dmd-2.080.1/test/runnable/extra-files/test17968a.d
--- old/dmd-2.080.0/test/runnable/extra-files/test17968a.d      1970-01-01 
01:00:00.000000000 +0100
+++ new/dmd-2.080.1/test/runnable/extra-files/test17968a.d      2018-06-07 
17:24:58.000000000 +0200
@@ -0,0 +1,16 @@
+struct S(T)
+{
+    T t;
+}
+
+class C(T) { }
+
+auto fun1(T)(T t)
+{
+    return S!T(t);
+}
+
+auto fun2()
+{
+    return new C!int;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/runnable/test17968.sh 
new/dmd-2.080.1/test/runnable/test17968.sh
--- old/dmd-2.080.0/test/runnable/test17968.sh  1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/runnable/test17968.sh  2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+
+$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}a${OBJ} -c 
${EXTRA_FILES}${SEP}test17968a.d
+$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${EXE} 
${EXTRA_FILES}${SEP}test17968.d ${OUTPUT_BASE}a${OBJ}
+
+${OUTPUT_BASE}${EXE}
+
+rm ${OUTPUT_BASE}{a${OBJ},${EXE}}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.080.0/test/runnable/test18902.sh 
new/dmd-2.080.1/test/runnable/test18902.sh
--- old/dmd-2.080.0/test/runnable/test18902.sh  1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.080.1/test/runnable/test18902.sh  2018-06-07 17:24:58.000000000 
+0200
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+# dmd -lib should fail without input sources/object files
+if $DMD -m${MODEL} -lib 18902.a; then
+    exit 1
+else
+    [ $? -eq 1 ]
+fi

++++++ druntime-2.080.0.tar.gz -> druntime-2.080.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.080.0/src/core/internal/string.d 
new/druntime-2.080.1/src/core/internal/string.d
--- old/druntime-2.080.0/src/core/internal/string.d     2018-04-17 
11:34:24.000000000 +0200
+++ new/druntime-2.080.1/src/core/internal/string.d     2018-05-25 
04:35:15.000000000 +0200
@@ -17,6 +17,10 @@
 
 char[] unsignedToTempString(ulong value, return char[] buf, uint radix = 10) 
@safe
 {
+    if (radix < 2)
+        // not a valid radix, just return an empty string
+        return buf[$ .. $];
+
     size_t i = buf.length;
     do
     {
@@ -74,6 +78,10 @@
     assert(long.sizeof.unsignedToTempString == "8");
     assert(uint.max.unsignedToTempString == "4294967295");
     assert(ulong.max.unsignedToTempString == "18446744073709551615");
+
+    // test bad radices
+    assert(100.unsignedToTempString(buf, 1) == "");
+    assert(100.unsignedToTempString(buf, 0) == "");
 }
 
 alias SignedStringBuf = char[20];
@@ -151,7 +159,7 @@
  * Returns:
  *      number of digits
  */
-int numDigits(uint radix = 10)(ulong value) @safe
+int numDigits(uint radix = 10)(ulong value) @safe if (radix >= 2 && radix <= 
36)
 {
      int n = 1;
      while (1)
@@ -197,6 +205,11 @@
     assert(1.numDigits!2 == 1);
     assert(2.numDigits!2 == 2);
     assert(3.numDigits!2 == 2);
+
+    // test bad radices
+    static assert(!__traits(compiles, 100.numDigits!1()));
+    static assert(!__traits(compiles, 100.numDigits!0()));
+    static assert(!__traits(compiles, 100.numDigits!37()));
 }
 
 int dstrcmp( scope const char[] s1, scope const char[] s2 ) @trusted
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.080.0/src/object.d 
new/druntime-2.080.1/src/object.d
--- old/druntime-2.080.0/src/object.d   2018-04-17 11:34:24.000000000 +0200
+++ new/druntime-2.080.1/src/object.d   2018-05-25 04:35:15.000000000 +0200
@@ -137,7 +137,7 @@
     }
 }
 
-auto opEquals(Object lhs, Object rhs)
+bool opEquals(Object lhs, Object rhs)
 {
     // If aliased to the same object or both null => equal
     if (lhs is rhs) return true;
@@ -162,7 +162,7 @@
 /************************
 * Returns true if lhs and rhs are equal.
 */
-auto opEquals(const Object lhs, const Object rhs)
+bool opEquals(const Object lhs, const Object rhs)
 {
     // A hack for the moment.
     return opEquals(cast()lhs, cast()rhs);

++++++ phobos-2.080.0.tar.gz -> phobos-2.080.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.080.0/changelog/bitflags-property-opdispatch.dd 
new/phobos-2.080.1/changelog/bitflags-property-opdispatch.dd
--- old/phobos-2.080.0/changelog/bitflags-property-opdispatch.dd        
2018-04-30 16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/bitflags-property-opdispatch.dd        
1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-`std.typecons.BitFlags` now supports opDispatch-based property access
-
-$(REF BitFlags, std, typecons) was extended so that enum members can be set 
and tested directly on the
-`BitFlags` instead of having to `&` with the underlying enum.
-
--------
-enum Features
-{
-    fast = 1 << 0,
-    size = 1 << 1,
-}
-
-void run(BitFlags!Features features)
-{
-    // get
-    if (features.fast && !features.size) {} // new new new
-    if ((features & Features.fast) && !(features & Features.size)) {} // old 
old old
-    // set
-    features.fast = true; // new new new
-    features.fast = false; // new new new
-    features.fast |= Features.fast; // old old old
-    features.fast &= ~Features.fast; // old old old
-}
--------
-
-This also works for unsafe `BitFlags` where the property get access tests for 
an exact
-match of all bits of the unsafe `BitFlags` combination.
-Analogously, the property set access clears or sets all bits of the unsafe 
`BitFlags` combination.
-
--------
-enum Features
-{
-    fast = 1 << 0,
-    size = 1 << 1,
-    combined = fast | size,
-}
-
-void run(BitFlags!(Features, Yes.unsafe) features)
-{
-    // get
-    if (features.combined) {} // new new new
-    if ((features & Features.combined) == BitFlags!(Features, 
Yes.unsafe)(Features.combined)) {} // old old old
-    // set
-    features.combined = true; // new new new
-    features.combined = false; // new new new
-    features.combined |= Features.combined; // old old old
-    features.combined &= ~Features.combined; // old old old
-}
--------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.080.0/changelog/rndtonl-deprecated.dd 
new/phobos-2.080.1/changelog/rndtonl-deprecated.dd
--- old/phobos-2.080.0/changelog/rndtonl-deprecated.dd  2018-04-30 
16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/rndtonl-deprecated.dd  1970-01-01 
01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-std.math.rndtonl has been deprecated
-
-$(REF rndtonl, std, math) is a rounding function only available when using the
-Digital Mars C Runtime on Windows. As this function is not cross-platform, it
-has been deprecated, and will be removed on version 2.089. Please use
-$(REF round, std, math) instead.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.080.0/changelog/shared-bitmapped-block.dd 
new/phobos-2.080.1/changelog/shared-bitmapped-block.dd
--- old/phobos-2.080.0/changelog/shared-bitmapped-block.dd      2018-04-30 
16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/shared-bitmapped-block.dd      1970-01-01 
01:00:00.000000000 +0100
@@ -1,26 +0,0 @@
-Added the SharedBitmappedBlock, as the thread-safe version of the regular 
BitmappedBlock.
-
-The new $(REF SharedBitmappedBlock, 
std,experimental,allocator,building_blocks,bitmapped_block) and its 
single-threaded version can now be instantiated with `Yes.multiblock` or 
`No.multiblock`.
-If instantiated with `Yes.multiblock` (the default behavior), each allocation 
can return an arbitrary number of blocks.
-With `No.multiblock` however, any allocation request can't exceed the block 
size. This allows for greater performance on both single and multithreaded 
environments.
-
----
-// The 'BitmappedBlock' is implicitly instantiated with Yes.multiblock
-auto a = BitmappedBlock!(blockSize, 8, Mallocator, Yes.multiblock)(numBlocks * 
blockSize);
-
-// Instantiated with Yes.multiblock, can allocate more than one block at a time
-void[] buf = a.allocate(2 * blockSize);
-assert(buf.length == 2 * blockSize);
-assert(a.deallocate(buf));
----
-
----
-// Instantate the 'BitmappedBlock' with No.multiblock
-auto a = BitmappedBlock!(blockSize, 8, Mallocator, No.multiblock)(1024 * 
blockSize);
-
-// Since instantiated with No.multiblock, can only allocate at most the block 
size
-void[] buf = a.allocate(blockSize + 1);
-assert(buf is null);
----
-
-For shared the same rules apply, we only need to replace `BitmappedBlock` with 
`SharedBitmappedBlock`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.080.0/changelog/std-aligned-block-list.dd 
new/phobos-2.080.1/changelog/std-aligned-block-list.dd
--- old/phobos-2.080.0/changelog/std-aligned-block-list.dd      2018-04-30 
16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/std-aligned-block-list.dd      1970-01-01 
01:00:00.000000000 +0100
@@ -1,10 +0,0 @@
-Implemented a new allocator, `AlignedBlockList` and its thread-safe version 
`SharedAlignedBlockList`
-
-$(REF AlignedBlockList, std,experimental,allocator,building_blocks, 
aligned_block_list) represents
-a list of allocators which allows for deallocations in constant time.
-Although allocations are in theory served in linear searching time, 
`deallocate` calls take
-$(BIGOH 1) time, by using aligned allocations. The `ParentAllocator` must 
implement `alignedAllocate`.
-
-$(REF SharedAlignedBlockList, std,experimental,allocator,building_blocks, 
aligned_block_list) has the
-same semantics as its single threaded version, however the internal allocators 
must be in addition marked
-as shared.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.080.0/changelog/std-exception-enforceEx.dd 
new/phobos-2.080.1/changelog/std-exception-enforceEx.dd
--- old/phobos-2.080.0/changelog/std-exception-enforceEx.dd     2018-04-30 
16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/std-exception-enforceEx.dd     1970-01-01 
01:00:00.000000000 +0100
@@ -1,24 +0,0 @@
-`std.exception.enforceEx` was deprecated in favor of `std.exception.enforce`
-
-With 2.079 $(REF enforce, std,exception) became a complete super set of
-$(REF enforceEx, std,exception)
-
-$(H3 Corrective action)
-
-Replace:
-
----
-import std.exception;
-alias enf = enforceEx!Exception;
-assertNotThrown(enf(true));
-assertThrown(enf(false, "blah"));
----
-
-with:
-
----
-import std.exception;
-alias enf = enforce!Exception;
-assertNotThrown(enf(true));
-assertThrown(enf(false, "blah"));
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.080.0/changelog/std-format-fixDigitGrouping.dd 
new/phobos-2.080.1/changelog/std-format-fixDigitGrouping.dd
--- old/phobos-2.080.0/changelog/std-format-fixDigitGrouping.dd 2018-04-30 
16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/std-format-fixDigitGrouping.dd 1970-01-01 
01:00:00.000000000 +0100
@@ -1,29 +0,0 @@
-Fixed digits grouping for floating point number without decimal part
-
-$(REF formatValue, std, format) now correctly groups digits in the output 
string
-by inserting a group separator character (,) every n characters specified
-by the $(LINK2 
https://dlang.org/library/std/format/formatted_write.html#format-string, 
Separator)
-grammar rule in cases with zero decimal precision specified in the format 
string
-for floating point numbers.
-
-No group separators at all are inserted for floating point numbers when 
formatted
-with zero precision (i.e. no decimal digits) in Phobos before this fix,
-regardless of the respective decimal part of the formatted number.
-
--------
-import std.format;
-
-assert(format("%,3.2f", 1172.009) == "1,172.01");
-assert(format("%,3.0f", 1172.009) == "1,172");
-assert(format("%#,3.4f", 1303.2508) == "1,303.250,8");
-assert(format("%#,3.0f", 1303.2508) == "1,303.");
-
-// original (buggy) behaviour before this fix
-//assert(format("%,3.0f", 1303.2508) == "1303");
-//assert(format("%,3.0f", 1303.) == "1303");
-
-// original (correct) behaviour before this fix
-//assert(format("%,3.1f", 1303.2508) == "1,303.3");
-//assert(format("%,3.2f", 1303.) == "1,303.00");
-//assert(format("%,3f", 1303.) == "1,303.000,000");
--------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.080.0/changelog/std-functional-binaryReverseArgs.dd 
new/phobos-2.080.1/changelog/std-functional-binaryReverseArgs.dd
--- old/phobos-2.080.0/changelog/std-functional-binaryReverseArgs.dd    
2018-04-30 16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/std-functional-binaryReverseArgs.dd    
1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-`std.functional.binaryReverseArgs` was deprecated in favor of 
`std.functional.reverseArgs`
-
-$(REF reverseArgs, std,functional) is a full super set of $(REF 
binaryReverseArgs, std,functional).
-
-Correct action: replace `binaryReverseArgs` with `reverseArgs`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.080.0/changelog/std-typecons-nullable-apply.dd 
new/phobos-2.080.1/changelog/std-typecons-nullable-apply.dd
--- old/phobos-2.080.0/changelog/std-typecons-nullable-apply.dd 2018-04-30 
16:38:51.000000000 +0200
+++ new/phobos-2.080.1/changelog/std-typecons-nullable-apply.dd 1970-01-01 
01:00:00.000000000 +0100
@@ -1,15 +0,0 @@
-`apply` was added to `std.typecons`.
-
-`apply` is an operation for $(REF Nullable, std, typecons) values that 
"unpacks" the `Nullable`, performs some
-operation (that is passed as a template parameter), then packs the result into 
another `Nullable` if necessary.
-When the initial `Nullable` is `null`, the resulting `Nullable` is also `null` 
and the function is not
-called.
-
------
-Nullable!int n;
-alias square = i => i * i;
-n = n.apply!square; // does nothing if isNull
-assert(n.isNull);
-n = 2;
-assert(n.apply!square.get == 4);
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.080.0/std/traits.d 
new/phobos-2.080.1/std/traits.d
--- old/phobos-2.080.0/std/traits.d     2018-04-30 16:38:51.000000000 +0200
+++ new/phobos-2.080.1/std/traits.d     2018-05-28 23:50:40.000000000 +0200
@@ -8341,6 +8341,17 @@
     static assert(res[0].stringof == "a");
 }
 
+// #18884: getSymbolsByUDA fails on AliasSeq members
+@safe unittest
+{
+    struct X
+    {
+        alias A = AliasSeq!(ulong, uint);
+    }
+
+    static assert(is(getSymbolsByUDA!(X, X) == AliasSeq!()));
+}
+
 // #18624: getSymbolsByUDA produces wrong result if one of the symbols having 
the UDA is a function
 @safe unittest
 {
@@ -8374,7 +8385,7 @@
         }
         else
         {
-            alias member = Alias!(__traits(getMember, symbol, names[0]));
+            alias member = AliasSeq!(__traits(getMember, symbol, names[0]));
 
             // Filtering not compiled members such as alias of basic types.
             static if (!__traits(compiles, hasUDA!(member, attribute)))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.080.0/std/uni.d new/phobos-2.080.1/std/uni.d
--- old/phobos-2.080.0/std/uni.d        2018-04-30 16:38:51.000000000 +0200
+++ new/phobos-2.080.1/std/uni.d        2018-05-28 23:50:40.000000000 +0200
@@ -4086,9 +4086,8 @@
     */
     void putValue(Key key, Value v)
     {
-        import std.conv : text;
         auto idx = getIndex(key);
-        enforce(idx >= curIndex, text(errMsg, " ", idx));
+        enforce(idx >= curIndex, errMsg);
         putAt(idx, v);
     }
 


Reply via email to