Hello community,

here is the log from the commit of package dmd for openSUSE:Factory checked in 
at 2018-01-25 12:41:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/dmd (Old)
 and      /work/SRC/openSUSE:Factory/.dmd.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "dmd"

Thu Jan 25 12:41:23 2018 rev:7 rq:569392 version:2.078.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/dmd/dmd.changes  2018-01-20 11:26:35.984688892 
+0100
+++ /work/SRC/openSUSE:Factory/.dmd.new/dmd.changes     2018-01-25 
12:41:26.632133318 +0100
@@ -1,0 +2,16 @@
+Wed Jan 24 20:19:25 UTC 2018 - [email protected]
+
+- Update to 2.078.1
+  - DMD Compiler regressions
+    * [REG2.060] DMD hang in semantic3 on alias this
+  - DMD Compiler bugs
+    * undefined reference to __coverage
+       * unittests get different names depending on how the files are passed 
to dmd
+       * building with -m64 doesn't work with sc.ini from the zip distribution 
and VS2017
+  - Phobos bugs
+    * std.array.replace throws a range violation if the from range is longer 
than the array
+       * Generic functions in std.math cannot be overloaded
+  - Druntime regressions
+    * module config is in file 'rt/config.d' which cannot be read
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ dmd.spec ++++++
--- /var/tmp/diff_new_pack.eNdorW/_old  2018-01-25 12:41:28.412050220 +0100
+++ /var/tmp/diff_new_pack.eNdorW/_new  2018-01-25 12:41:28.412050220 +0100
@@ -20,7 +20,7 @@
 %define bootstrap_version 2.078.0
 %define sover  0_78
 Name:           dmd
-Version:        2.078.0
+Version:        2.078.1
 Release:        0
 Summary:        D Programming Language 2.0
 License:        BSL-1.0

++++++ dmd-2.078.0.tar.gz -> dmd-2.078.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/VERSION new/dmd-2.078.1/VERSION
--- old/dmd-2.078.0/VERSION     2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/VERSION     2018-01-21 23:30:35.000000000 +0100
@@ -1 +1 @@
-v2.078.0
+v2.078.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/PR7356.dd 
new/dmd-2.078.1/changelog/PR7356.dd
--- old/dmd-2.078.0/changelog/PR7356.dd 2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/PR7356.dd 1970-01-01 01:00:00.000000000 +0100
@@ -1,40 +0,0 @@
-`opDispatch` resolution in `with` statements
-
-`opDispatch` resolution in `with` statements has been modified to bring it 
into compliance with the existing scope resolution rules in the language 
specification.  See $(LINK2 $(ROOT_DIR)spec/statement.html#with-statement, 
WithStatement) in the language specification.
-
-Prior to this release, the following code would not compile because the 
compiler would not be able to resolve the second call to `f()`, as `Bar` does 
not implement `f()` or `opDispatch`.
--------
-import std.stdio;
-
-struct Foo
-{
-    void opDispatch(string name)()
-    {
-        mixin("writeln(\"Foo.opDispatch!" ~ name ~ "\");");
-    }
-}
-
-struct Bar
-{
-    // `Bar` does not implement `f()` or `opDispatch`
-}
-
-void main()
-{
-    Foo foo;
-    Bar bar;
-
-    with(foo)
-    {
-        f();       // prints "Foo.opDispatch!f"
-        with(bar)
-        {
-            f();   // Prior to this Release: Error: undefined identifer `f`
-                   // Starting with  this release: Prints "Foo.opDispatch!f".
-                   // `f`'s resolution is forwarded up the scope hierarchy.
-        }
-    }
-}
--------
-
-Starting with this release, the second call to `f()` will be forwarded up the 
scope hierarchy, matching the implementation of `Foo.opDispatch`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/body.dd 
new/dmd-2.078.1/changelog/body.dd
--- old/dmd-2.078.0/changelog/body.dd   2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/body.dd   1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-Generate header files using `do` instead of `body` as per DIP1003
-
-Support for
-$(LINK2 https://github.com/dlang/DIPs/blob/master/DIPs/DIP1003.md, DIP1003)
-was added in release 2.075.0. Use of `body` in an error message and
-header file generation has been fixed in this release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/crt-constructor.dd 
new/dmd-2.078.1/changelog/crt-constructor.dd
--- old/dmd-2.078.0/changelog/crt-constructor.dd        2018-01-02 
21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/crt-constructor.dd        1970-01-01 
01:00:00.000000000 +0100
@@ -1,33 +0,0 @@
-pragma(crt_constructor) and pragma(crt_destructor) were added
-
-This allows programs to run initialization code before or cleanup code after C
-main.
-
-In particular those pragmas can be used in $(TT -betterC) code as substitutes
-for $(LINK2 $(ROOT_DIR)spec/class.html#shared_static_constructors, `shared 
static this()`) and
-$(LINK2 $(ROOT_DIR)spec/class.html#shared_static_destructors, `shared static 
~this()`).
-
-$(RED Note:) At the time of execution druntime is not initialized.
-
-$(RED Note:) The order in which constructors are executed is unspecified.
-
----
-import core.stdc.stdio;
-
-pragma(crt_constructor)
-void init()
-{
-    puts("init");
-}
-
-pragma(crt_destructor)
-void fini()
-{
-    puts("fini");
-}
-
-extern(C) int main()
-{
-    puts("main");
-}
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/fix11006.dd 
new/dmd-2.078.1/changelog/fix11006.dd
--- old/dmd-2.078.0/changelog/fix11006.dd       2018-01-02 21:51:20.000000000 
+0100
+++ new/dmd-2.078.1/changelog/fix11006.dd       1970-01-01 01:00:00.000000000 
+0100
@@ -1,12 +0,0 @@
-Subtraction of pointers that point to different types has been deprecated.
-
-$(LINK2 $(ROOT_DIR)spec/expression.html#add_expressions, The language 
specification) reads:
-"If both operands are pointers, and the operator is -, the pointers are 
subtracted and the result is divided by the size of the type pointed to by the 
operands. It is an error if the pointers point to different types."
-
-Prior to this release, the compiler allowed the following pointer arithmetic:
--------
-void* p1;
-int* p2;
-auto p3 = p2 - p1;
--------
-Starting with this release, the subtraction of pointers that point to 
different types will emit a deprecation warning.  The warning will remain in 
place for at least a year, after which it will be changed to an error.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/fix15243_PR7403.dd 
new/dmd-2.078.1/changelog/fix15243_PR7403.dd
--- old/dmd-2.078.0/changelog/fix15243_PR7403.dd        2018-01-02 
21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/fix15243_PR7403.dd        1970-01-01 
01:00:00.000000000 +0100
@@ -1,31 +0,0 @@
-Variadic template arguments no longer require `alias` workaround
-
-Prior to this release, the following code would not compile.
-
-----
-class C(Types...)
-{
-    void apply(U)(U delegate(Types[0]) f0) { }  // Error: cannot deduce 
function from argument types
-}
-
-void test()
-{
-    C!int c;
-
-    int f(int) { return 0; }
-
-    c.apply(&f);
-}
-----
-
-It could be worked around by `alias`ing the individual template arguments.
-
-----
-class C(Types...)
-{
-    alias Types[0] T0;
-    void apply(U)(U delegate(T0) f0) { }  // OK
-}
-----
-
-Starting with this release, the workaround is no longer required.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/fix16997.dd 
new/dmd-2.078.1/changelog/fix16997.dd
--- old/dmd-2.078.0/changelog/fix16997.dd       2018-01-02 21:51:20.000000000 
+0100
+++ new/dmd-2.078.1/changelog/fix16997.dd       1970-01-01 01:00:00.000000000 
+0100
@@ -1,32 +0,0 @@
-fix Issue 16997 - Integral promotion rules not being followed for unary + - ~ 
operators
-
-To follow the C integral promotion rules, types are promoted to `int` before 
the unary
-+ - or ~ operators are applied. Existing D does not do this.
-
-This is corrected when one of the following command line switches are used:
-
-    -transition=intpromote
-    -transition=16997
-
-It affects operands of type `byte`, `ubyte`, `short`, `ushort`, `char`, and 
`wchar`.
-The operands are promoted to `int` before the operator is applied. The result
-type will now be `int`.
-
-The values computed will be different for some values of the operands:
-
-* All values of - and ~ applied to ubyte, ushort, char, and dchar operands 
will change.
-
-* The values of `-byte(-128)` and `-short(-32768)` will change.
-
-If one of the '-transition=' switches is not specified, a deprecation will be 
emitted for these operations.
-To fix the deprecation and work as desired with or without the '-transition=' 
switch:
-
-Option 1:
-
-Rewrite `op b` as `op int(b)` to use correct, i.e. C-like, behavior.
-
-Option 2:
-
-Rewrite `op b` as `typeof(b)(op int(b))` to preserve the old behavior.
-
-Once deprecated this will become an error, and then the C-like behavior will 
become the default.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/optional_ModuleInfo.dd 
new/dmd-2.078.1/changelog/optional_ModuleInfo.dd
--- old/dmd-2.078.0/changelog/optional_ModuleInfo.dd    2018-01-02 
21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/optional_ModuleInfo.dd    1970-01-01 
01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-Optional `ModuleInfo`
-
-$(LINK2 $(ROOT_DIR)phobos/object.html#.ModuleInfo, `ModuleInfo`) is not a 
necessary feature of D.  There are use cases where the program author may 
choose to provide an alternate implementation of the D runtime that does not 
include `ModuleInfo`.  This could be for interoperability with other software 
or to reduce the footprint of D programs in resource constrained platforms.
-
-Prior to this release, the compiler would emit an error if `ModuleInfo` was 
not declared in the D runtime.
-
-Platform support is provided by the D runtime. `ModuleInfo` is declared in 
object.d. Therefore, the compiler can see, at compile-time, whether or not the 
platform has provided support for `ModuleInfo` and generate object code 
accordingly.
-
-Starting with this release, if `ModuleInfo` is not declared in the D runtime, 
the compiler will simply not generate `ModuleInfo` instances.
-
-This should reduce friction for those wishing to incrementally port D to new 
platforms and use D in a more pay-as-you-go fashion.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/raii.dd 
new/dmd-2.078.1/changelog/raii.dd
--- old/dmd-2.078.0/changelog/raii.dd   2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/raii.dd   1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-Added RAII and try-finally support for -betterC mode.
-
-This also means that scope(exit) statements will also work, because
-they are internally lowered to try-finally statements.
-
-This does not mean that exceptions are supported. Throwing,
-catching, and stack frame unwinding is not supported, as that
-requires support from Phobos.
-
-It means that, for RAII, when variables go out of lexical scope
-their destructors get run. When try blocks from try-finally statements
-exit, the code in the finally block is run.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/changelog/vs-auto-detection.dd 
new/dmd-2.078.1/changelog/vs-auto-detection.dd
--- old/dmd-2.078.0/changelog/vs-auto-detection.dd      2018-01-02 
21:51:20.000000000 +0100
+++ new/dmd-2.078.1/changelog/vs-auto-detection.dd      1970-01-01 
01:00:00.000000000 +0100
@@ -1,10 +0,0 @@
-Windows: dmd can now detect Visual Studio installation paths
-
-dmd now determines the environment variables that are usually set if the 
"Command Line prompt for Visual Studio" link is used to open a console window 
(or vcvarsall.bat is executed). This includes Windows SDK directories and 
Visual C library directories. When compiling with -m64 or -m32mscoff this 
allows dmd to invoke the linker without having a Visual Studio version 
preselected by the installer.
-
-In particular, the variables WindowsSdkDir, WindowsSdkVersion, 
UniversalCRTSdkDir,
-UCRTVersion, VSINSTALLDIR, VisualStudioVersion, VCINSTALLDIR and 
VCTOOLSINSTALLDIR are
-determined from the registry if they are not set in the environment or sc.ini.
-
-Supported Windows SDK range from 7.0A to 10.x, supported Visual Studio 
Versions are
-VS 2008 to VS 2017. If multiple versions are installed, highest versions are 
preferred.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/ini/windows/bin/sc.ini 
new/dmd-2.078.1/ini/windows/bin/sc.ini
--- old/dmd-2.078.0/ini/windows/bin/sc.ini      2018-01-02 21:51:20.000000000 
+0100
+++ new/dmd-2.078.1/ini/windows/bin/sc.ini      2018-01-21 23:30:35.000000000 
+0100
@@ -17,124 +17,12 @@
 
 
 [Environment64]
-LIB="%@P%\..\lib64"
-
+LIB=%@P%\..\lib64
 ; needed to avoid COMDAT folding (bugzilla 10664)
 DFLAGS=%DFLAGS% -L/OPT:NOICF
 
-; default to 32-bit linker (can generate 64-bit code) that has a common path
-; for VS2008, VS2010, VS2012, and VS2013. This will be overridden below if the
-; installer detects VS.
-LINKCMD=%VCINSTALLDIR%\bin\link.exe
-
-
-; -----------------------------------------------------------------------------
-; This enclosed section is specially crafted to be activated by the Windows
-; installer when it detects the actual paths to VC and SDK installations so
-; modify this in the default sc.ini within the dmd git repo with care.
-;
-; End users: You can fill in the path to VC and Windows SDK and uncomment out
-; the appropriate LINKCMD to manually enable support yourself.
-;
-; Users using Visual Studio 2010 Express with SDK 7.0A: The installer cannot
-; determine the path to the 64-bit compiler included with SDK 7.0A. It's
-; recommended to install the Windows SDK 7.1A. Alternatively you can set
-; LINKCMD as the path to link.exe SDK 7.0A installs. It would typically be:
-;   C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\link.exe
-
-
-; Windows installer replaces the following lines with the actual paths
-;VCINSTALLDIR=
-;WindowsSdkDir=
-;UniversalCRTSdkDir=
-;UCRTVersion=
-
-; Windows installer uncomments the version detected
-;VC2017 LINKCMD=%VCINSTALLDIR%\bin\HostX86\x86\link.exe
-;VC2015 LINKCMD=%VCINSTALLDIR%\bin\x86_amd64\link.exe
-;VC2013 LINKCMD=%VCINSTALLDIR%\bin\x86_amd64\link.exe
-;VC2012 LINKCMD=%VCINSTALLDIR%\bin\x86_amd64\link.exe
-;VC2010 LINKCMD=%VCINSTALLDIR%\bin\amd64\link.exe
-;VC2008 LINKCMD=%VCINSTALLDIR%\bin\amd64\link.exe
-
-; needed with /DEBUG to find mspdb*.dll (only for VS2012 or later)
-;VC2017 PATH=%PATH%;%VCINSTALLDIR%\bin\HostX86\x86
-;VC2015 PATH=%PATH%;%VCINSTALLDIR%\bin\x86_amd64;%VCINSTALLDIR%\bin
-;VC2013 
PATH=%PATH%;%VCINSTALLDIR%\bin\x86_amd64;%VCINSTALLDIR%\..\Common7\IDE;%VCINSTALLDIR%\bin
-;VC2012 PATH=%PATH%;%VCINSTALLDIR%\bin\x86_amd64;%VCINSTALLDIR%\..\Common7\IDE
-
-; ----------------------------------------------------------------------------
-
-
-; Add the library subdirectories of all VC and Windows SDK versions so things
-; just work for users using dmd from the VS 64-bit Command Prompt
-
-; C Runtime libraries
-LIB=%LIB%;"%VCINSTALLDIR%\lib\amd64"
-;VC2017 LIB=%LIB%;"%VCINSTALLDIR%\lib\x64"
-
-; Platform/UCRT libraries (Windows SDK 10.0)
-LIB=%LIB%;"%UniversalCRTSdkDir%\Lib\%UCRTVersion%\um\x64"
-LIB=%LIB%;"%UniversalCRTSdkDir%\Lib\%UCRTVersion%\ucrt\x64"
-
-; Platform libraries (Windows SDK 8.1)
-LIB=%LIB%;"%WindowsSdkDir%\Lib\winv6.3\um\x64"
-
-; Platform libraries (Windows SDK 8)
-LIB=%LIB%;"%WindowsSdkDir%\Lib\win8\um\x64"
-
-; Platform libraries (Windows SDK 7 and 6)
-LIB=%LIB%;"%WindowsSdkDir%\Lib\x64"
-
-; DirectX (newer versions are included in the Platform SDK but this
-; will allow us to support older versions)
-LIB=%LIB%;"%DXSDK_DIR%\Lib\x64"
-
-
 ; -----------------------------------------------------------------------------
 [Environment32mscoff]
-LIB="%@P%\..\lib32mscoff"
-
-; settings very much copied from Environment64, see comments there
+LIB=%@P%\..\lib32mscoff
 ; needed to avoid COMDAT folding (bugzilla 10664)
 DFLAGS=%DFLAGS% -L/OPT:NOICF
-
-; Windows installer replaces the following lines with the actual paths
-;VCINSTALLDIR=
-;WindowsSdkDir=
-;UniversalCRTSdkDir=
-;UCRTVersion=
-
-LINKCMD=%VCINSTALLDIR%\bin\link.exe
-
-; needed with /DEBUG to find mspdb*.dll (only for VS2012 or VS2013)
-;VC2017 LINKCMD=%VCINSTALLDIR%\bin\HostX86\x86\link.exe
-;VC2015 PATH=%PATH%;%VCINSTALLDIR%\bin
-;VC2013 PATH=%PATH%;%VCINSTALLDIR%\..\Common7\IDE;%VCINSTALLDIR%\bin
-;VC2012 PATH=%PATH%;%VCINSTALLDIR%\..\Common7\IDE
-
-; ----------------------------------------------------------------------------
-; Add the library subdirectories of all VC and Windows SDK versions so things
-; just work for users using dmd from the VS Command Prompt
-
-; C Runtime libraries
-LIB=%LIB%;"%VCINSTALLDIR%\lib"
-;VC2017 LIB=%LIB%;"%VCINSTALLDIR%\lib\x86"
-
-; Platform/UCRT libraries (Windows SDK 10.0)
-LIB=%LIB%;"%UniversalCRTSdkDir%\Lib\%UCRTVersion%\um\x86"
-LIB=%LIB%;"%UniversalCRTSdkDir%\Lib\%UCRTVersion%\ucrt\x86"
-
-; Platform libraries (Windows SDK 8.1)
-LIB=%LIB%;"%WindowsSdkDir%\Lib\winv6.3\um\x86"
-
-; Platform libraries (Windows SDK 8)
-LIB=%LIB%;"%WindowsSdkDir%\Lib\win8\um\x86"
-
-; Platform libraries (Windows SDK 7 and 6)
-LIB=%LIB%;"%WindowsSdkDir%\Lib"
-
-; DirectX (newer versions are included in the Platform SDK but this
-; will allow us to support older versions)
-LIB=%LIB%;"%DXSDK_DIR%\Lib\x86"
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/src/dmd/dmodule.d 
new/dmd-2.078.1/src/dmd/dmodule.d
--- old/dmd-2.078.0/src/dmd/dmodule.d   2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/src/dmd/dmodule.d   2018-01-21 23:30:35.000000000 +0100
@@ -1318,6 +1318,22 @@
     {
         v.visit(this);
     }
+
+    /***********************************************
+     * Writes this module's fully-qualified name to buf
+     * Params:
+     *    buf = The buffer to write to
+     */
+    void fullyQualifiedName(ref OutBuffer buf)
+    {
+        buf.writestring(ident.toString());
+
+        for (auto package_ = parent; package_ !is null; package_ = 
package_.parent)
+        {
+            buf.prependstring(".");
+            buf.prependstring(package_.ident.toChars());
+        }
+    }
 }
 
 /***********************************************************
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/src/dmd/func.d 
new/dmd-2.078.1/src/dmd/func.d
--- old/dmd-2.078.0/src/dmd/func.d      2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/src/dmd/func.d      2018-01-21 23:30:35.000000000 +0100
@@ -3468,8 +3468,10 @@
     private static Identifier createIdentifier(Loc loc, Scope* sc)
     {
         OutBuffer buf;
-        auto index = sc ? sc._module.unitTestCounter++ : 0;
-        buf.printf("__unittest_%s_%u_%d", loc.filename, loc.linnum, index);
+        writeModuleNameOrFileName(buf, loc, sc);
+        buf.prependstring("__unittest_");
+        const index = sc ? sc._module.unitTestCounter++ : 0;
+        buf.printf("_%u_%d", loc.linnum, index);
 
         // replace characters that demangle can't handle
         auto str = buf.peekString;
@@ -3479,6 +3481,25 @@
         return Identifier.idPool(buf.peekSlice());
     }
 
+    /*************************************************************************
+     * Writes a module name to name a unittest. Tries to use the fully
+     * qualified name if possible to avoid mismatches when compiling 
separately.
+     * Otherwise uses the file name.
+     * Params:
+     *    buf = The buffer to write to.
+     *    loc = The location of the unit test declaration.
+     *    scope = The scope of the unit test declaration.
+     */
+    private static void writeModuleNameOrFileName(ref OutBuffer buf, Loc loc, 
Scope* scope_)
+    {
+        if (scope_ is null || scope_._module is null || scope_._module.ident 
is null)
+        {
+            buf.writestring(loc.filename);
+            return;
+        }
+        scope_._module.fullyQualifiedName(buf);
+    }
+
     override AggregateDeclaration isThis()
     {
         return null;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/src/dmd/glue.d 
new/dmd-2.078.1/src/dmd/glue.d
--- old/dmd-2.078.0/src/dmd/glue.d      2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/src/dmd/glue.d      2018-01-21 23:30:35.000000000 +0100
@@ -386,13 +386,10 @@
     if (global.params.cov)
     {
         /* Create coverage identifier:
-         *  private uint[numlines] __coverage;
+         *  uint[numlines] __coverage;
          */
-        m.cov = symbol_calloc("__coverage");
-        m.cov.Stype = type_fake(TYint);
-        m.cov.Stype.Tmangle = mTYman_c;
-        m.cov.Stype.Tcount++;
-        m.cov.Sclass = SCstatic;
+        m.cov = toSymbolX(m, "__coverage", SCglobal, type_fake(TYint), "Z");
+        m.cov.Stype.Tmangle = mTYman_d;
         m.cov.Sfl = FLdata;
 
         scope dtb = new DtBuilder();
@@ -1575,4 +1572,3 @@
     Symbol* s = toStringSymbol(id, len, 1);
     return el_ptr(s);
 }
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/src/dmd/mtype.d 
new/dmd-2.078.1/src/dmd/mtype.d
--- old/dmd-2.078.0/src/dmd/mtype.d     2018-01-02 21:51:20.000000000 +0100
+++ new/dmd-2.078.1/src/dmd/mtype.d     2018-01-21 23:30:35.000000000 +0100
@@ -6,6 +6,8 @@
  * Authors:     $(LINK2 http://www.digitalmars.com, Walter Bright)
  * License:     $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 
1.0)
  * Source:      $(LINK2 
https://github.com/dlang/dmd/blob/master/src/dmd/mtype.d, _mtype.d)
+ * Documentation:  https://dlang.org/phobos/dmd_mtype.html
+ * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/src/dmd/mtype.d
  */
 
 module dmd.mtype;
@@ -6057,9 +6059,12 @@
                      */
                     while (1)
                     {
-                        Type tat = ta.toBasetype().aliasthisOf();
+                        Type tab = ta.toBasetype();
+                        Type tat = tab.aliasthisOf();
                         if (!tat || !tat.implicitConvTo(tprm))
                             break;
+                        if (tat == tab)
+                            break;
                         ta = tat;
                     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/compilable/test16621.d 
new/dmd-2.078.1/test/compilable/test16621.d
--- old/dmd-2.078.0/test/compilable/test16621.d 1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.078.1/test/compilable/test16621.d 2018-01-21 23:30:35.000000000 
+0100
@@ -0,0 +1,23 @@
+// https://issues.dlang.org/show_bug.cgi?id=16621
+
+template xxx()
+{
+    Vector2f xxx()
+    {
+        return this;
+    }
+}
+
+struct Vector2f
+{
+    mixin xxx!();
+    alias xxx this;
+}
+
+void foo(ref Vector2f pos);
+
+void test()
+{
+    Vector2f v;
+    foo(v);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/fail_compilation/fail7848.d 
new/dmd-2.078.1/test/fail_compilation/fail7848.d
--- old/dmd-2.078.0/test/fail_compilation/fail7848.d    2018-01-02 
21:51:20.000000000 +0100
+++ new/dmd-2.078.1/test/fail_compilation/fail7848.d    2018-01-21 
23:30:35.000000000 +0100
@@ -3,11 +3,11 @@
 /*
 TEST_OUTPUT:
 ---
-fail_compilation/fail7848.d(35): Error: pure function 
'fail7848.C.__unittest_fail_compilation_fail7848_d_33_0' cannot call impure 
function 'fail7848.func'
-fail_compilation/fail7848.d(35): Error: @safe function 
'fail7848.C.__unittest_fail_compilation_fail7848_d_33_0' cannot call @system 
function 'fail7848.func'
-fail_compilation/fail7848.d(35): Error: @nogc function 
'fail7848.C.__unittest_fail_compilation_fail7848_d_33_0' cannot call non-@nogc 
function 'fail7848.func'
+fail_compilation/fail7848.d(35): Error: pure function 
'fail7848.C.__unittest_fail7848_33_0' cannot call impure function 
'fail7848.func'
+fail_compilation/fail7848.d(35): Error: @safe function 
'fail7848.C.__unittest_fail7848_33_0' cannot call @system function 
'fail7848.func'
+fail_compilation/fail7848.d(35): Error: @nogc function 
'fail7848.C.__unittest_fail7848_33_0' cannot call non-@nogc function 
'fail7848.func'
 fail_compilation/fail7848.d(35): Error: function `fail7848.func` is not nothrow
-fail_compilation/fail7848.d(33): Error: nothrow function 
`fail7848.C.__unittest_fail_compilation_fail7848_d_33_0` may throw
+fail_compilation/fail7848.d(33): Error: nothrow function 
`fail7848.C.__unittest_fail7848_33_0` may throw
 fail_compilation/fail7848.d(40): Error: pure function 
'fail7848.C.__invariant1' cannot call impure function 'fail7848.func'
 fail_compilation/fail7848.d(40): Error: @safe function 
'fail7848.C.__invariant1' cannot call @system function 'fail7848.func'
 fail_compilation/fail7848.d(40): Error: @nogc function 
'fail7848.C.__invariant1' cannot call non-@nogc function 'fail7848.func'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/fail_compilation/ice14424.d 
new/dmd-2.078.1/test/fail_compilation/ice14424.d
--- old/dmd-2.078.0/test/fail_compilation/ice14424.d    2018-01-02 
21:51:20.000000000 +0100
+++ new/dmd-2.078.1/test/fail_compilation/ice14424.d    2018-01-21 
23:30:35.000000000 +0100
@@ -2,7 +2,7 @@
 /*
 TEST_OUTPUT:
 ---
-fail_compilation/ice14424.d(12): Error: 
`tuple(__unittest_fail_compilation_imports_a14424_d_3_0)` has no effect
+fail_compilation/ice14424.d(12): Error: `tuple(__unittest_imports_a14424_3_0)` 
has no effect
 ---
 */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/runnable/extra-files/lib13742a.d 
new/dmd-2.078.1/test/runnable/extra-files/lib13742a.d
--- old/dmd-2.078.0/test/runnable/extra-files/lib13742a.d       1970-01-01 
01:00:00.000000000 +0100
+++ new/dmd-2.078.1/test/runnable/extra-files/lib13742a.d       2018-01-21 
23:30:35.000000000 +0100
@@ -0,0 +1,6 @@
+module lib13742a;
+
+void performLocked(alias PROC)()
+{
+    PROC();
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/runnable/extra-files/lib13742b.d 
new/dmd-2.078.1/test/runnable/extra-files/lib13742b.d
--- old/dmd-2.078.0/test/runnable/extra-files/lib13742b.d       1970-01-01 
01:00:00.000000000 +0100
+++ new/dmd-2.078.1/test/runnable/extra-files/lib13742b.d       2018-01-21 
23:30:35.000000000 +0100
@@ -0,0 +1,8 @@
+module lib13742b;
+import lib13742a;
+
+void clear()
+{
+    void foo() {} // nested function
+    performLocked!foo; // template from other module (preceding on command 
line)
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/runnable/extra-files/test13742.d 
new/dmd-2.078.1/test/runnable/extra-files/test13742.d
--- old/dmd-2.078.0/test/runnable/extra-files/test13742.d       1970-01-01 
01:00:00.000000000 +0100
+++ new/dmd-2.078.1/test/runnable/extra-files/test13742.d       2018-01-21 
23:30:35.000000000 +0100
@@ -0,0 +1,6 @@
+import lib13742b;
+
+void main()
+{
+    clear();
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dmd-2.078.0/test/runnable/test13742.sh 
new/dmd-2.078.1/test/runnable/test13742.sh
--- old/dmd-2.078.0/test/runnable/test13742.sh  1970-01-01 01:00:00.000000000 
+0100
+++ new/dmd-2.078.1/test/runnable/test13742.sh  2018-01-21 23:30:35.000000000 
+0100
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+set -x # debug windows issues
+set -ueo pipefail
+
+src=runnable${SEP}extra-files
+dir=${RESULTS_DIR}${SEP}runnable
+output_file=${dir}/test13742.sh.out
+
+if [ $OS == "win32" -o  $OS == "win64" ]; then
+    LIBEXT=.lib
+    OBJ=.obj
+else
+    LIBEXT=.a
+    OBJ=.o
+fi
+
+$DMD -m${MODEL} -I${src} -lib -cov -of${dir}${SEP}test13742${LIBEXT} 
${src}${SEP}lib13742a.d ${src}${SEP}lib13742b.d
+$DMD -m${MODEL} -I${src} -cov -of${dir}${SEP}test13742${EXE} 
${src}${SEP}test13742.d ${dir}${SEP}test13742${LIBEXT}
+
+${RESULTS_DIR}/runnable/test13742${EXE} --DRT-covopt=dstpath:${dir}${SEP}
+
+rm 
${RESULTS_DIR}/runnable/{runnable-extra-files-{lib13742a,lib13742b,test13742}.lst,test13742{${OBJ},${LIBEXT},${EXE}}}
+
+echo Success > ${output_file}

++++++ druntime-2.078.0.tar.gz -> druntime-2.078.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/druntime-2.078.0/changelog/core-runtime-unittestEnhancement.dd 
new/druntime-2.078.1/changelog/core-runtime-unittestEnhancement.dd
--- old/druntime-2.078.0/changelog/core-runtime-unittestEnhancement.dd  
2017-12-26 13:50:44.000000000 +0100
+++ new/druntime-2.078.1/changelog/core-runtime-unittestEnhancement.dd  
1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-`core.runtime` now allows more fine-grained control over unittests.
-
-`core.runtime.extendedModuleUnitTester` property allows specifying information
-about the tests run, and how to handle the result. See documentation for
-`core.runtime.UnitTestResult` for details.
-
-`core.runtime.moduleUnitTester` (setting a unittest handler that returns bool)
-will continue to be supported for legacy projects.
-
------------------
-import core.runtime;
-import core.stdc.stdio: printf;
-
-UnitTestResult customTester()
-{
-    UnitTestResult ret;
-
-    // run only the tests in my package
-    immutable prefix = "myPackage.";
-    foreach (m; ModuleInfo)
-    {
-        if (m.unitTest !is null && m.name.length >= prefix.length &&
-              m.name[0 .. prefix.length] == prefix)
-        {
-            ++ret.executed; // count unit tests run
-            try
-            {
-                m.unitTest();
-                ++ret.passed; // count unit tests passed
-            }
-            catch(Throwable t)
-            {
-                auto msg = t.toString();
-                printf("%.*s\n", cast(uint)msg.length, msg.ptr);
-            }
-        }
-    }
-    // always summarize
-    ret.summarize = true;
-    // only unit testing, don't ever run main
-    ret.runMain = false;
-}
-
-version(unittest) static shared this()
-{
-    Runtime.extendedModuleUnitTester = &customTester;
-}
------------------
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.078.0/changelog/covopts.dd 
new/druntime-2.078.1/changelog/covopts.dd
--- old/druntime-2.078.0/changelog/covopts.dd   2017-12-26 13:50:44.000000000 
+0100
+++ new/druntime-2.078.1/changelog/covopts.dd   1970-01-01 01:00:00.000000000 
+0100
@@ -1,13 +0,0 @@
-The runtime learned a few new options to customize how coverage reports are 
created.
-
-The format is the same as with the GC but using `covopt` as suffix, for example
-you can pass options separating them with spaces like `--DRT-covopt "merge:1
-dstpath:/tmp"`.
-
-These are the currently accepted options:
-
-$(DL
-  $(DT merge) $(DD Merge the current run with existing reports if 1, or 
overwrite the existing reports if 0.)
-  $(DT srcpath) $(DD Set path to where source files are located.)
-  $(DT dstpath) $(DD Set path to where listing files are to be written.)
-)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.078.0/posix.mak 
new/druntime-2.078.1/posix.mak
--- old/druntime-2.078.0/posix.mak      2017-12-26 13:50:44.000000000 +0100
+++ new/druntime-2.078.1/posix.mak      2018-01-12 18:35:35.000000000 +0100
@@ -231,7 +231,7 @@
 HAS_ADDITIONAL_TESTS:=$(shell test -d test && echo 1)
 ifeq ($(HAS_ADDITIONAL_TESTS),1)
        ADDITIONAL_TESTS:=test/init_fini test/exceptions test/coverage 
test/profile test/cycles test/allocations test/typeinfo \
-           test/thread test/unittest
+           test/thread test/unittest test/imports
        ADDITIONAL_TESTS+=$(if $(SHARED),test/shared,)
 endif
 
@@ -241,7 +241,7 @@
        @echo done
 else
 unittest : unittest-debug unittest-release
-unittest-%:
+unittest-%: target
        $(MAKE) -f $(MAKEFILE) unittest OS=$(OS) MODEL=$(MODEL) DMD=$(DMD) 
BUILD=$*
 endif
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.078.0/src/core/runtime.d 
new/druntime-2.078.1/src/core/runtime.d
--- old/druntime-2.078.0/src/core/runtime.d     2017-12-26 13:50:44.000000000 
+0100
+++ new/druntime-2.078.1/src/core/runtime.d     2018-01-12 18:35:35.000000000 
+0100
@@ -650,13 +650,18 @@
             }
         }
     }
-    import rt.config : rt_configOption;
+
+    import core.internal.traits : externDFunc;
+    alias rt_configCallBack = string delegate(string) @nogc nothrow;
+    alias fn_configOption = string function(string opt, scope 
rt_configCallBack dg, bool reverse) @nogc nothrow;
+    alias rt_configOption = externDFunc!("rt.config.rt_configOption", 
fn_configOption);
+
     if (results.passed != results.executed)
     {
         // by default, we always print a summary if there are failures.
         results.summarize = true;
     }
-    else switch (rt_configOption("testmode"))
+    else switch (rt_configOption("testmode", null, false))
     {
     case "":
         // By default, run main. Switch to only doing unit tests in 2.080
@@ -674,7 +679,7 @@
         results.summarize = !results.runMain;
         break;
     default:
-        throw new Error("Unknown --DRT-testmode option: " ~ 
rt_configOption("testmode"));
+        throw new Error("Unknown --DRT-testmode option: " ~ 
rt_configOption("testmode", null, false));
     }
 
     return results;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.078.0/src/core/thread.d 
new/druntime-2.078.1/src/core/thread.d
--- old/druntime-2.078.0/src/core/thread.d      2017-12-26 13:50:44.000000000 
+0100
+++ new/druntime-2.078.1/src/core/thread.d      2018-01-12 18:35:35.000000000 
+0100
@@ -304,7 +304,6 @@
         {
             version (Shared)
             {
-                import rt.sections;
                 Thread obj = cast(Thread)(cast(void**)arg)[0];
                 auto loadedLibraries = (cast(void**)arg)[1];
                 .free(arg);
@@ -317,7 +316,11 @@
 
             // loadedLibraries need to be inherited from parent thread
             // before initilizing GC for TLS (rt_tlsgc_init)
-            version (Shared) inheritLoadedLibraries(loadedLibraries);
+            version (Shared)
+            {
+                externDFunc!("rt.sections_elf_shared.inheritLoadedLibraries",
+                             void function(void*) @nogc 
nothrow)(loadedLibraries);
+            }
 
             assert( obj.m_curr is &obj.m_main );
             obj.m_main.bstack = getStackBottom();
@@ -404,7 +407,11 @@
                     append( t );
                 }
                 rt_moduleTlsDtor();
-                version (Shared) cleanupLoadedLibraries();
+                version (Shared)
+                {
+                    
externDFunc!("rt.sections_elf_shared.cleanupLoadedLibraries",
+                                 void function() @nogc nothrow)();
+                }
             }
             catch( Throwable t )
             {
@@ -712,15 +719,17 @@
 
                 version (Shared)
                 {
-                    import rt.sections;
-                    auto libs = pinLoadedLibraries();
+                    auto libs = 
externDFunc!("rt.sections_elf_shared.pinLoadedLibraries",
+                                             void* function() @nogc nothrow)();
+
                     auto ps = cast(void**).malloc(2 * size_t.sizeof);
                     if (ps is null) onOutOfMemoryError();
                     ps[0] = cast(void*)this;
                     ps[1] = cast(void*)libs;
                     if( pthread_create( &m_addr, &attr, &thread_entryPoint, ps 
) != 0 )
                     {
-                        unpinLoadedLibraries(libs);
+                        
externDFunc!("rt.sections_elf_shared.unpinLoadedLibraries",
+                                     void function(void*) @nogc nothrow)(libs);
                         .free(ps);
                         onThreadError( "Error creating thread" );
                     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.078.0/test/imports/Makefile 
new/druntime-2.078.1/test/imports/Makefile
--- old/druntime-2.078.0/test/imports/Makefile  1970-01-01 01:00:00.000000000 
+0100
+++ new/druntime-2.078.1/test/imports/Makefile  2018-01-12 18:35:35.000000000 
+0100
@@ -0,0 +1,14 @@
+include ../common.mak
+
+TESTS:=bug18193
+
+.PHONY: all clean
+all: $(addprefix $(ROOT)/,$(addsuffix .done,$(TESTS)))
+
+$(ROOT)/%.done:
+       @echo Testing $*
+       @mkdir -p $(basename $@)
+       $(QUIET)$(DMD) -version=Shared -o- -deps=$@ -Isrc -I../../import src/$*
+
+clean:
+       rm -rf $(GENERATED)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/druntime-2.078.0/test/imports/src/bug18193.d 
new/druntime-2.078.1/test/imports/src/bug18193.d
--- old/druntime-2.078.0/test/imports/src/bug18193.d    1970-01-01 
01:00:00.000000000 +0100
+++ new/druntime-2.078.1/test/imports/src/bug18193.d    2018-01-12 
18:35:35.000000000 +0100
@@ -0,0 +1,2 @@
+import core.runtime;
+import core.thread;

++++++ phobos-2.078.0.tar.gz -> phobos-2.078.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/.circleci/run.sh 
new/phobos-2.078.1/.circleci/run.sh
--- old/phobos-2.078.0/.circleci/run.sh 2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/.circleci/run.sh 2018-01-17 06:58:15.000000000 +0100
@@ -5,7 +5,7 @@
 HOST_DMD_VER=2.072.2 # same as in dmd/src/posix.mak
 DSCANNER_DMD_VER=2.077.0 # dscanner needs a more up-to-date version
 CURL_USER_AGENT="CirleCI $(curl --version | head -n 1)"
-DUB=${DUB:-$HOME/dlang/dub/dub}
+DUB=${DUB:-dub}
 N=2
 CIRCLE_NODE_INDEX=${CIRCLE_NODE_INDEX:-0}
 BUILD="debug"
@@ -127,6 +127,8 @@
 # extract publictests and run them independently
 publictests()
 {
+    source "$(CURL_USER_AGENT=\"$CURL_USER_AGENT\" bash ~/dlang/install.sh 
dmd-$HOST_DMD_VER --activate)"
+
     # checkout a specific version of https://github.com/dlang/tools
     if [ ! -d ../tools ] ; then
         clone https://github.com/dlang/tools.git ../tools master
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/changelog/std-algorithm-iteration-mean.dd 
new/phobos-2.078.1/changelog/std-algorithm-iteration-mean.dd
--- old/phobos-2.078.0/changelog/std-algorithm-iteration-mean.dd        
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-algorithm-iteration-mean.dd        
1970-01-01 01:00:00.000000000 +0100
@@ -1,27 +0,0 @@
-`mean` Was Added To `std.algorithm`
-
-$(REF mean, std, algorithm, iteration) accurately finds the
-mean (a.k.a the average) of any range of number-like elements.
-
------
-import std.algorithm.iteration : mean;
-import std.math : approxEqual;
-
-int[] arr1 = [1, 2, 3];
-real[] arr2 = [1.5, 2.5, 12.5];
-
-assert(arr1.mean.approxEqual(2));
-assert(arr2.mean.approxEqual(5.5));
-
-// user defined number types also work
-import std.bigint : BigInt;
-
-auto bigint_arr = [
-    BigInt("1_000_000_000_000_000_000"),
-    BigInt("2_000_000_000_000_000_000"),
-    BigInt("3_000_000_000_000_000_000"),
-    BigInt("6_000_000_000_000_000_000")
-];
-auto seed = BigInt(0);
-assert(bigint_arr.mean(seed) == BigInt("3_000_000_000_000_000_000"));
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/changelog/std-algorithm-searching-findSkip.dd 
new/phobos-2.078.1/changelog/std-algorithm-searching-findSkip.dd
--- old/phobos-2.078.0/changelog/std-algorithm-searching-findSkip.dd    
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-algorithm-searching-findSkip.dd    
1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-`findSkip` can now skip elements using just a predicate function
-
-Previously, $(REF findSkip, std, algorithm, searching) could only
-be used to find a specific string. Now, a new overload allows elements
-in a range to be skipped over if the passed function returns `true`:
-
--------
-import std.ascii : isWhite;
-string s = "   abc";
-assert(findSkip!isWhite(s) == 3 && s == "abc");
-assert(!findSkip!isWhite(s) && s == "abc");
--------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/changelog/std-array-bypair.dd 
new/phobos-2.078.1/changelog/std-array-bypair.dd
--- old/phobos-2.078.0/changelog/std-array-bypair.dd    2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-array-bypair.dd    1970-01-01 
01:00:00.000000000 +0100
@@ -1,20 +0,0 @@
-`std.array.byPair` now returns a `NamedTuple`
-
-$(REF byPair, std, array) now returns a named tuple.
-
----
-import std.array : byPair;
-import std.typecons : Tuple;
-
-int[string] dict = ["b": 2, "c": 3];
-auto pairs = dict.byPair;
-static assert(is(typeof(pairs.front) : Tuple!(string,int)));
-
-// access by index (existing way)
-assert(pairs.front[0] == "b");
-assert(pairs.front[1] == 2);
-
-// access by name (enabled with this release)
-assert(pairs.front.key == "b");
-assert(pairs.front.value == 2);
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/changelog/std-container-dlist-linearRemoveElement.dd 
new/phobos-2.078.1/changelog/std-container-dlist-linearRemoveElement.dd
--- old/phobos-2.078.0/changelog/std-container-dlist-linearRemoveElement.dd     
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-container-dlist-linearRemoveElement.dd     
1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-`std.container.dlist` supports `linearRemoveElement`
-
-`linearRemoveElement` removes the first occurence of an element from the dlist
-
------
-import std.container : Dlist;
-import std.algorithm.comparison : equal;
-
-auto a = DList!int(-1, 1, 2, 1, 3, 4);
-a.linearRemoveElement(1);
-assert(equal(a[], [-1, 2, 1, 3, 4]));
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/changelog/std-container-slist-linearRemoveElement.dd 
new/phobos-2.078.1/changelog/std-container-slist-linearRemoveElement.dd
--- old/phobos-2.078.0/changelog/std-container-slist-linearRemoveElement.dd     
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-container-slist-linearRemoveElement.dd     
1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-`std.container.slist` supports `linearRemoveElement`
-
-`linearRemoveElement` removes the first occurence of an element from the slist
-
------
-import std.container : Slist;
-import std.algorithm.comparison : equal;
-
-auto a = SList!int(-1, 1, 2, 1, 3, 4);
-a.linearRemoveElement(1);
-assert(equal(a[], [-1, 2, 1, 3, 4]));
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/changelog/std-range-package-Transposed-deprecate-save.dd 
new/phobos-2.078.1/changelog/std-range-package-Transposed-deprecate-save.dd
--- old/phobos-2.078.0/changelog/std-range-package-Transposed-deprecate-save.dd 
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-range-package-Transposed-deprecate-save.dd 
1970-01-01 01:00:00.000000000 +0100
@@ -1,15 +0,0 @@
-Deprecate `save` for `std.range.package.Transposed`
-
-Transposed is incorrectly marked as a forward range. Its `popFront` primitive
-cannot be used without affecting any other copies made with `save`. `save` 
will be
-removed from Transposed in November 2018.
-
------
-auto x = [[1,2,3],[4,5,6]].transposed;
-auto y = x.save;
-y.popFront;
-assert(x.equal([[1,4],[2,5],[3,6]])); // FAILS, x is really [[2,5],[3,6]]
------
-
-For more details, please see the respective $(LINK2 
https://issues.dlang.org/show_bug.cgi?id=17952,
-Bugzilla issue).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/changelog/std-typecons-ternary-opBinary.dd 
new/phobos-2.078.1/changelog/std-typecons-ternary-opBinary.dd
--- old/phobos-2.078.0/changelog/std-typecons-ternary-opBinary.dd       
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/changelog/std-typecons-ternary-opBinary.dd       
1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-`std.typecons.Ternary.opBinary` supports `bool` bitwise operands
-
-Now $(REF Ternary, std, typecons) can be used in bitwise operations with 
`bool`s:
-
------
-import std.typecons : Ternary;
-
-Ternary a = Ternary(true);
-assert(a == Ternary.yes);
-assert((a & false) == Ternary.no);
-assert((a | false) == Ternary.yes);
-assert((a ^ true) == Ternary.no);
-assert((a ^ false) == Ternary.yes);
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/algorithm/searching.d 
new/phobos-2.078.1/std/algorithm/searching.d
--- old/phobos-2.078.0/std/algorithm/searching.d        2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/algorithm/searching.d        2018-01-17 
06:58:15.000000000 +0100
@@ -3445,7 +3445,7 @@
     import std.range : enumerate;
     import std.typecons : tuple;
 
-    assert([2, 1, 4, 3].minElement == 1);
+    assert([2, 7, 1, 3].minElement == 1);
 
     // allows to get the index of an element too
     assert([5, 3, 7, 9].enumerate.minElement!"a.value" == tuple(1, 3));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/array.d 
new/phobos-2.078.1/std/array.d
--- old/phobos-2.078.0/std/array.d      2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/array.d      2018-01-17 06:58:15.000000000 +0100
@@ -2124,6 +2124,7 @@
         && (hasLength!R2 || isSomeString!R2))
 {
     import std.algorithm.searching : find;
+    import std.range : dropOne;
 
     if (from.empty) return subject;
 
@@ -2134,7 +2135,11 @@
     auto app = appender!(E[])();
     app.put(subject[0 .. subject.length - balance.length]);
     app.put(to.save);
-    replaceInto(app, balance[from.length .. $], from, to);
+    // replacing an element in an array is different to a range replacement
+    static if (is(Unqual!E : Unqual!R1))
+        replaceInto(app, balance.dropOne, from, to);
+    else
+        replaceInto(app, balance[from.length .. $], from, to);
 
     return app.data;
 }
@@ -2146,6 +2151,35 @@
     assert("Hello Wörld".replace("l", "h") == "Hehho Wörhd");
 }
 
+@safe unittest
+{
+    assert([1, 2, 3, 4, 2].replace([2], [5]) == [1, 5, 3, 4, 5]);
+    assert([3, 3, 3].replace([3], [0]) == [0, 0, 0]);
+    assert([3, 3, 4, 3].replace([3, 3], [1, 1, 1]) == [1, 1, 1, 4, 3]);
+}
+
+// https://issues.dlang.org/show_bug.cgi?id=18215
+@safe unittest
+{
+    auto arr = ["aaa.dd", "b"];
+    arr = arr.replace("aaa.dd", ".");
+    assert(arr == [".", "b"]);
+
+    arr = ["_", "_", "aaa.dd", "b", "c", "aaa.dd", "e"];
+    arr = arr.replace("aaa.dd", ".");
+    assert(arr == ["_", "_", ".", "b", "c", ".", "e"]);
+}
+
+// https://issues.dlang.org/show_bug.cgi?id=18215
+@safe unittest
+{
+    assert([[0], [1, 2], [0], [3]].replace([0], [4]) == [[4], [1, 2], [4], 
[3]]);
+    assert([[0], [1, 2], [0], [3], [1, 2]]
+            .replace([1, 2], [0]) == [[0], [0], [0], [3], [0]]);
+    assert([[0], [1, 2], [0], [3], [1, 2], [0], [1, 2]]
+            .replace([[0], [1, 2]], [[4]]) == [[4], [0], [3], [1, 2], [4]]);
+}
+
 /// ditto
 void replaceInto(E, Sink, R1, R2)(Sink sink, E[] subject, R1 from, R2 to)
 if (isOutputRange!(Sink, E) && isDynamicArray!(E[])
@@ -2153,6 +2187,7 @@
     && (hasLength!R2 || isSomeString!R2))
 {
     import std.algorithm.searching : find;
+    import std.range : dropOne;
 
     if (from.empty)
     {
@@ -2169,7 +2204,11 @@
         }
         sink.put(subject[0 .. subject.length - balance.length]);
         sink.put(to.save);
-        subject = balance[from.length .. $];
+        // replacing an element in an array is different to a range replacement
+        static if (is(Unqual!E : Unqual!R1))
+            subject = balance.dropOne;
+        else
+            subject = balance[from.length .. $];
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/affix_allocator.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/affix_allocator.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/affix_allocator.d 
    2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/affix_allocator.d 
    2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_affix_allocator.d)
+*/
 module std.experimental.allocator.building_blocks.affix_allocator;
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/allocator_list.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/allocator_list.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/allocator_list.d  
    2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/allocator_list.d  
    2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_allocator_list.d)
+*/
 module std.experimental.allocator.building_blocks.allocator_list;
 
 import std.experimental.allocator.building_blocks.null_allocator;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/bitmapped_block.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/bitmapped_block.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/bitmapped_block.d 
    2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/bitmapped_block.d 
    2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_bitmapped_block.d)
+*/
 module std.experimental.allocator.building_blocks.bitmapped_block;
 
 import std.experimental.allocator.building_blocks.null_allocator;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/bucketizer.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/bucketizer.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/bucketizer.d  
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/bucketizer.d  
2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_bucketizer.d)
+*/
 module std.experimental.allocator.building_blocks.bucketizer;
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/fallback_allocator.d
 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/fallback_allocator.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/fallback_allocator.d
  2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/fallback_allocator.d
  2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_fallback_allocator.d)
+*/
 module std.experimental.allocator.building_blocks.fallback_allocator;
 
 import std.experimental.allocator.common;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/free_list.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/free_list.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/free_list.d   
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/free_list.d   
2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_free_list.d)
+*/
 module std.experimental.allocator.building_blocks.free_list;
 
 import std.experimental.allocator.common;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/free_tree.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/free_tree.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/free_tree.d   
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/free_tree.d   
2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_free_tree.d)
+*/
 module std.experimental.allocator.building_blocks.free_tree;
 
 import std.experimental.allocator.common;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/kernighan_ritchie.d
 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/kernighan_ritchie.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/kernighan_ritchie.d
   2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/kernighan_ritchie.d
   2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_kernighan_ritchie.d)
+*/
 module std.experimental.allocator.building_blocks.kernighan_ritchie;
 import std.experimental.allocator.building_blocks.null_allocator;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/null_allocator.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/null_allocator.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/null_allocator.d  
    2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/null_allocator.d  
    2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_null_allocator.d)
+*/
 module std.experimental.allocator.building_blocks.null_allocator;
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/package.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/package.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/package.d     
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/package.d     
2018-01-17 06:58:15.000000000 +0100
@@ -1,3 +1,4 @@
+// Written in the D programming language.
 /**
 $(H2 Assembling Your Own Allocator)
 
@@ -280,6 +281,8 @@
 pointers on top of another allocator.)))
 )
 
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_package.d)
+
 Macros:
 MYREF2 = $(REF_SHORT $1, std,experimental,allocator,building_blocks,$2)
 MYREF3 = $(REF_SHORT $1, std,experimental,allocator,$2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/quantizer.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/quantizer.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/quantizer.d   
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/quantizer.d   
2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_quantizer.d)
+*/
 module std.experimental.allocator.building_blocks.quantizer;
 
 import std.experimental.allocator.common;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/region.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/region.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/region.d      
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/region.d      
2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_region.d)
+*/
 module std.experimental.allocator.building_blocks.region;
 
 import std.experimental.allocator.building_blocks.null_allocator;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/scoped_allocator.d
 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/scoped_allocator.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/scoped_allocator.d
    2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/scoped_allocator.d
    2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_scoped_allocator.d)
+*/
 module std.experimental.allocator.building_blocks.scoped_allocator;
 
 import std.experimental.allocator.common;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/segregator.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/segregator.d
--- old/phobos-2.078.0/std/experimental/allocator/building_blocks/segregator.d  
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/building_blocks/segregator.d  
2018-01-17 06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/building_blocks/_segregator.d)
+*/
 module std.experimental.allocator.building_blocks.segregator;
 
 import std.experimental.allocator.common;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/stats_collector.d 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/stats_collector.d
--- 
old/phobos-2.078.0/std/experimental/allocator/building_blocks/stats_collector.d 
    2017-12-30 03:25:23.000000000 +0100
+++ 
new/phobos-2.078.1/std/experimental/allocator/building_blocks/stats_collector.d 
    2018-01-17 06:58:15.000000000 +0100
@@ -4,15 +4,18 @@
 calling point. The statistics collected can be configured statically by 
choosing
 combinations of `Options` appropriately.
 
-Example:
-----
-import std.experimental.allocator.gc_allocator : GCAllocator;
-import std.experimental.allocator.building_blocks.free_list : FreeList;
-alias Allocator = StatsCollector!(GCAllocator, Options.bytesUsed);
-----
+Source: $(PHOBOSSRC 
std/experimental/allocator/building_blocks/_stats_collector.d)
 */
 module std.experimental.allocator.building_blocks.stats_collector;
 
+///
+@safe unittest
+{
+    import std.experimental.allocator.gc_allocator : GCAllocator;
+    import std.experimental.allocator.building_blocks.free_list : FreeList;
+    alias Allocator = StatsCollector!(GCAllocator, Options.bytesUsed);
+}
+
 import std.experimental.allocator.common;
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/allocator/common.d 
new/phobos-2.078.1/std/experimental/allocator/common.d
--- old/phobos-2.078.0/std/experimental/allocator/common.d      2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/common.d      2018-01-17 
06:58:15.000000000 +0100
@@ -1,9 +1,12 @@
+// Written in the D programming language.
 /**
 Utility and ancillary artifacts of `std.experimental.allocator`. This module
 shouldn't be used directly; its functionality will be migrated into more
 appropriate parts of `std`.
 
 Authors: $(HTTP erdani.com, Andrei Alexandrescu), Timon Gehr (`Ternary`)
+
+Source: $(PHOBOSSRC std/experimental/allocator/_common.d)
 */
 module std.experimental.allocator.common;
 import std.algorithm.comparison, std.traits;
@@ -88,7 +91,7 @@
     return n.roundUpToMultipleOf(a.alignment);
 }
 
-/**
+/*
 Returns s rounded up to a multiple of base.
 */
 @safe @nogc nothrow pure
@@ -108,7 +111,7 @@
     assert(118.roundUpToMultipleOf(11) == 121);
 }
 
-/**
+/*
 Returns `n` rounded up to a multiple of alignment, which must be a power of 2.
 */
 @safe @nogc nothrow pure
@@ -133,7 +136,7 @@
     assert(118.roundUpToAlignment(64) == 128);
 }
 
-/**
+/*
 Returns `n` rounded down to a multiple of alignment, which must be a power of 
2.
 */
 @safe @nogc nothrow pure
@@ -153,7 +156,7 @@
     assert(63.roundDownToAlignment(64) == 0);
 }
 
-/**
+/*
 Advances the beginning of `b` to start at alignment `a`. The resulting buffer
 may therefore be shorter. Returns the adjusted buffer, or null if obtaining a
 non-empty buffer is impossible.
@@ -177,7 +180,7 @@
     assert(roundUpToAlignment(buf, 128) !is null);
 }
 
-/**
+/*
 Like `a / b` but rounds the result up, not down.
 */
 @safe @nogc nothrow pure
@@ -187,7 +190,7 @@
     return (a + b - 1) / b;
 }
 
-/**
+/*
 Returns `s` rounded up to a multiple of `base`.
 */
 @nogc nothrow pure
@@ -209,7 +212,7 @@
     assert(roundStartToMultipleOf(p, 16) is p);
 }
 
-/**
+/*
 Returns $(D s) rounded up to the nearest power of 2.
 */
 @safe @nogc nothrow pure
@@ -246,7 +249,7 @@
     assert(((size_t.max >> 1) + 1).roundUpToPowerOf2 == (size_t.max >> 1) + 1);
 }
 
-/**
+/*
 Returns the number of trailing zeros of $(D x).
 */
 @safe @nogc nothrow pure
@@ -270,7 +273,7 @@
     assert(trailingZeros(4) == 2);
 }
 
-/**
+/*
 Returns `true` if `ptr` is aligned at `alignment`.
 */
 @nogc nothrow pure
@@ -279,7 +282,7 @@
     return cast(size_t) ptr % alignment == 0;
 }
 
-/**
+/*
 Returns the effective alignment of `ptr`, i.e. the largest power of two that is
 a divisor of `ptr`.
 */
@@ -296,7 +299,7 @@
     assert(effectiveAlignment(&x) >= int.alignof);
 }
 
-/**
+/*
 Aligns a pointer down to a specified alignment. The resulting pointer is less
 than or equal to the given pointer.
 */
@@ -308,7 +311,7 @@
     return cast(void*) (cast(size_t) ptr & ~(alignment - 1UL));
 }
 
-/**
+/*
 Aligns a pointer up to a specified alignment. The resulting pointer is greater
 than or equal to the given pointer.
 */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/gc_allocator.d 
new/phobos-2.078.1/std/experimental/allocator/gc_allocator.d
--- old/phobos-2.078.0/std/experimental/allocator/gc_allocator.d        
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/gc_allocator.d        
2018-01-17 06:58:15.000000000 +0100
@@ -1,10 +1,15 @@
-///
+// Written in the D programming language.
+/**
+D's built-in garbage-collected allocator.
+
+Source: $(PHOBOSSRC std/experimental/allocator/_gc_allocator.d)
+*/
 module std.experimental.allocator.gc_allocator;
 import std.experimental.allocator.common;
 
 /**
 D's built-in garbage-collected allocator.
- */
+*/
 struct GCAllocator
 {
     import core.memory : GC;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/mallocator.d 
new/phobos-2.078.1/std/experimental/allocator/mallocator.d
--- old/phobos-2.078.0/std/experimental/allocator/mallocator.d  2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/mallocator.d  2018-01-17 
06:58:15.000000000 +0100
@@ -1,4 +1,9 @@
-///
+// Written in the D programming language.
+/**
+The C heap allocator.
+
+Source: $(PHOBOSSRC std/experimental/allocator/_mallocator.d)
+*/
 module std.experimental.allocator.mallocator;
 import std.experimental.allocator.common;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phobos-2.078.0/std/experimental/allocator/mmap_allocator.d 
new/phobos-2.078.1/std/experimental/allocator/mmap_allocator.d
--- old/phobos-2.078.0/std/experimental/allocator/mmap_allocator.d      
2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/mmap_allocator.d      
2018-01-17 06:58:15.000000000 +0100
@@ -1,9 +1,10 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/allocator/_mmap_allocator.d)
+*/
 module std.experimental.allocator.mmap_allocator;
 
-// MmapAllocator
 /**
-
 Allocator (currently defined only for Posix and Windows) using
 $(D $(LINK2 https://en.wikipedia.org/wiki/Mmap, mmap))
 and $(D $(LUCKY munmap)) directly (or their Windows equivalents). There is no
@@ -12,7 +13,6 @@
 and each call to $(D deallocate(b)) issues $(D munmap(b.ptr, b.length)).
 So $(D MmapAllocator) is usually intended for allocating large chunks to be
 managed by fine-granular allocators.
-
 */
 struct MmapAllocator
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/allocator/showcase.d 
new/phobos-2.078.1/std/experimental/allocator/showcase.d
--- old/phobos-2.078.0/std/experimental/allocator/showcase.d    2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/showcase.d    2018-01-17 
06:58:15.000000000 +0100
@@ -1,9 +1,10 @@
+// Written in the D programming language.
 /**
-
 Collection of typical and useful prebuilt allocators using the given
 components. User code would typically import this module and use its
 facilities, or import individual heap building blocks and assemble them.
 
+Source: $(PHOBOSSRC std/experimental/allocator/_showcase.d)
 */
 module std.experimental.allocator.showcase;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/allocator/typed.d 
new/phobos-2.078.1/std/experimental/allocator/typed.d
--- old/phobos-2.078.0/std/experimental/allocator/typed.d       2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/allocator/typed.d       2018-01-17 
06:58:15.000000000 +0100
@@ -1,3 +1,4 @@
+// Written in the D programming language.
 /**
 This module defines `TypedAllocator`, a statically-typed allocator that
 aggregates multiple untyped allocators and uses them depending on the static
@@ -5,6 +6,8 @@
 for thread-local vs. thread-shared data, or for fixed-size data (`struct`,
 `class` objects) vs. resizable data (arrays).
 
+Source: $(PHOBOSSRC std/experimental/allocator/_typed.d)
+
 Macros:
 T2=$(TR <td style="text-align:left">$(D $1)</td> $(TD $(ARGS $+)))
 */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/checkedint.d 
new/phobos-2.078.1/std/experimental/checkedint.d
--- old/phobos-2.078.0/std/experimental/checkedint.d    2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/checkedint.d    2018-01-17 
06:58:15.000000000 +0100
@@ -1,3 +1,4 @@
+// Written in the D programming language.
 /**
 $(SCRIPT inhibitQuickIndex = 1;)
 
@@ -187,6 +188,7 @@
 )
 )
 
+Source: $(PHOBOSSRC std/experimental/_checkedint.d)
 */
 module std.experimental.checkedint;
 import std.traits : isFloatingPoint, isIntegral, isNumeric, isUnsigned, Unqual;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/logger/core.d 
new/phobos-2.078.1/std/experimental/logger/core.d
--- old/phobos-2.078.0/std/experimental/logger/core.d   2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/logger/core.d   2018-01-17 
06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/logger/_core.d)
+*/
 module std.experimental.logger.core;
 
 import core.sync.mutex : Mutex;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/logger/filelogger.d 
new/phobos-2.078.1/std/experimental/logger/filelogger.d
--- old/phobos-2.078.0/std/experimental/logger/filelogger.d     2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/logger/filelogger.d     2018-01-17 
06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/logger/_filelogger.d)
+*/
 module std.experimental.logger.filelogger;
 
 import std.experimental.logger.core;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/logger/multilogger.d 
new/phobos-2.078.1/std/experimental/logger/multilogger.d
--- old/phobos-2.078.0/std/experimental/logger/multilogger.d    2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/logger/multilogger.d    2018-01-17 
06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/logger/_multilogger.d)
+*/
 module std.experimental.logger.multilogger;
 
 import std.experimental.logger.core;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/logger/nulllogger.d 
new/phobos-2.078.1/std/experimental/logger/nulllogger.d
--- old/phobos-2.078.0/std/experimental/logger/nulllogger.d     2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/logger/nulllogger.d     2018-01-17 
06:58:15.000000000 +0100
@@ -1,4 +1,7 @@
-///
+// Written in the D programming language.
+/**
+Source: $(PHOBOSSRC std/experimental/logger/_nulllogger.d)
+*/
 module std.experimental.logger.nulllogger;
 
 import std.experimental.logger.core;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/experimental/logger/package.d 
new/phobos-2.078.1/std/experimental/logger/package.d
--- old/phobos-2.078.0/std/experimental/logger/package.d        2017-12-30 
03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/experimental/logger/package.d        2018-01-17 
06:58:15.000000000 +0100
@@ -1,3 +1,4 @@
+// Written in the D programming language.
 /**
 Implements logging facilities.
 
@@ -176,6 +177,8 @@
 calls to its stored $(D Logger). The $(D NullLogger) does not do anything. It
 will never log a message and will never throw on a log call with $(D LogLevel)
 $(D error).
+
+Source: $(PHOBOSSRC std/experimental/logger/_package.d)
 */
 module std.experimental.logger;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phobos-2.078.0/std/math.d 
new/phobos-2.078.1/std/math.d
--- old/phobos-2.078.0/std/math.d       2017-12-30 03:25:23.000000000 +0100
+++ new/phobos-2.078.1/std/math.d       2018-01-17 06:58:15.000000000 +0100
@@ -136,6 +136,7 @@
 static import core.math;
 static import core.stdc.math;
 static import core.stdc.fenv;
+import std.range.primitives : isInputRange, ElementType;
 import std.traits; // CommonType, isFloatingPoint, isIntegral, isSigned, 
isUnsigned, Largest, Unqual
 
 version(LDC)
@@ -5411,6 +5412,7 @@
  *  $(D true) if $(D_PARAM x) is finite.
  */
 bool isFinite(X)(X x) @trusted pure nothrow @nogc
+if (isFloatingPoint!X)
 {
     alias F = floatTraits!(X);
     ushort* pe = cast(ushort *)&x;
@@ -5458,6 +5460,7 @@
  * be converted to normal reals.
  */
 bool isNormal(X)(X x) @trusted pure nothrow @nogc
+if (isFloatingPoint!X)
 {
     alias F = floatTraits!(X);
     static if (F.realFormat == RealFormat.ibmExtended)
@@ -5504,6 +5507,7 @@
  *  $(D true) if $(D_PARAM x) is a denormal number.
  */
 bool isSubnormal(X)(X x) @trusted pure nothrow @nogc
+if (isFloatingPoint!X)
 {
     /*
         Need one for each format because subnormal floats might
@@ -5709,6 +5713,7 @@
  * Return 1 if sign bit of e is set, 0 if not.
  */
 int signbit(X)(X x) @nogc @trusted pure nothrow
+if (isFloatingPoint!X)
 {
     alias F = floatTraits!(X);
     return ((cast(ubyte *)&x)[F.SIGNPOS_BYTE] & 0x80) != 0;
@@ -5810,6 +5815,7 @@
 $(D x > 0), and $(NAN) if x==$(NAN).
  */
 F sgn(F)(F x) @safe pure nothrow @nogc
+if (isNumeric!F)
 {
     // @@@TODO@@@: make this faster
     return x > 0 ? 1 : x < 0 ? -1 : x;
@@ -6282,6 +6288,7 @@
  * not equal to y.
  */
 T nextafter(T)(const T x, const T y) @safe pure nothrow @nogc
+if (isFloatingPoint!T)
 {
     if (x == y) return y;
     return ((y>x) ? nextUp(x) :  nextDown(x));
@@ -7490,6 +7497,9 @@
        pair of elements.
  */
 bool approxEqual(T, U, V)(T lhs, U rhs, V maxRelDiff, V maxAbsDiff = 1e-5)
+if ((isNumeric!T || (isInputRange!T && isNumeric!(ElementType!T))) &&
+    (isNumeric!U || (isInputRange!U && isNumeric!(ElementType!U))) &&
+    isNumeric!V)
 {
     import std.range.primitives : empty, front, isInputRange, popFront;
     static if (isInputRange!T)


Reply via email to