Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package dmd for openSUSE:Factory checked in at 2026-03-29 20:01:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dmd (Old) and /work/SRC/openSUSE:Factory/.dmd.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dmd" Sun Mar 29 20:01:13 2026 rev:44 rq:1343466 version:2.112.1 Changes: -------- --- /work/SRC/openSUSE:Factory/dmd/dmd.changes 2026-01-13 21:34:22.871541962 +0100 +++ /work/SRC/openSUSE:Factory/.dmd.new.8177/dmd.changes 2026-03-29 20:01:41.947920911 +0200 @@ -1,0 +2,30 @@ +Sun Mar 29 15:07:21 UTC 2026 - Andrea Manzini <[email protected]> + +- Update to version 2.112.1 + * fix #22323 - error "cannot get frame pointer" with AA in struct literal + * fix #22354 - aa[key] ~= null discarded + * fix #22386 - Indexed initialization of multi dimensional const array does + not compile + * fix #22406 - [REG 2.112] Error: function '_d_aaLen' is not callable + * [stable] Fix #22422 - Missing _d_cast lowering for CommaExp + * [stable] etc.linux.memoryerror: Adapt to dynamic SIGSTKSZ since glibc v2.34 + * Backport PR's to fix stable + * fix #22480 - Regression in DMD v2.112, betterC can not work with CTFE + associative array any more + * fix #22510 - dup of inout aa broke with 2.112 + * fix #21976: [REG 2.112.0] Array comparison performance regression + * Revert "fix #21976: [REG 2.112.0] Array comparison performance regression" + * [stable] Fix #22544 - Cannot index AA in with block + * [stable] buildAAIndexRValueX(): Avoid IdentifierExp, prefer direct VarExp + * [stable] Fix #22543 - Cannot index AA literal in global-variable + initializer + * [stable] Fix #22501 - GC allocation for CTFE-available static array + * Fix issue #22535 - [REG 2.112] Unicode symbols inside q + * [stable] Fix #22594 - TypeInfo_Class.m_flags wrong wrt. noPointers flag + when the only pointers come from tuple members + * Fix #22625 - undefined identifier 'addr' in core.sys.posix.netinet.in + * Fix Issue #22567 - alias this and nested AAs cause compiler SIGILL + * fix issue #22556 - shared AAs with RefCounted values don't work even after + removing shared + +------------------------------------------------------------------- Old: ---- dmd-2.112.0.tar.gz phobos-2.112.0.tar.gz New: ---- dmd-2.112.1.tar.gz phobos-2.112.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dmd.spec ++++++ --- /var/tmp/diff_new_pack.pApwAr/_old 2026-03-29 20:01:42.503943818 +0200 +++ /var/tmp/diff_new_pack.pApwAr/_new 2026-03-29 20:01:42.507943983 +0200 @@ -29,7 +29,7 @@ BuildRequires: phobos-devel-static %endif Name: dmd -Version: 2.112.0 +Version: 2.112.1 Release: 0 Summary: D Programming Language 2.0 License: BSL-1.0 ++++++ dmd-2.112.0.tar.gz -> dmd-2.112.1.tar.gz ++++++ ++++ 1819 lines of diff (skipped) ++++++ phobos-2.112.0.tar.gz -> phobos-2.112.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/changelog/add_lazycache_function.dd new/phobos-2.112.1/changelog/add_lazycache_function.dd --- old/phobos-2.112.0/changelog/add_lazycache_function.dd 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/changelog/add_lazycache_function.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,15 +0,0 @@ -Add lazyCache to std.algorithm.iteration - -The new `lazyCache` function provides a lazily evaluated range caching mechanism. -Unlike `cache`, which eagerly evaluates range elements during construction, -`lazyCache` defers evaluation until elements are explicitly requested. - ---- -auto result = iota(-4, 5).map!(a => tuple(a, expensiveComputation(a)))().lazyCache(); -// No computations performed at this point - -auto firstElement = result.front; -// First element is now evaluated ---- - -See the $(REF lazyCache, std,algorithm,iteration) documentation for more details. \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/changelog/emulate_getrandom.dd new/phobos-2.112.1/changelog/emulate_getrandom.dd --- old/phobos-2.112.0/changelog/emulate_getrandom.dd 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/changelog/emulate_getrandom.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,19 +0,0 @@ -`getrandom()` backwards compatibility shim - -To restore compatibility with older Linux platforms where `getrandom()` is -unavailable either due to an outdated kernel or a legacy C library, Phobos now -ships with a shim that emulates a limited subset of `getrandom()`’s behavior -by reading random bytes from `/dev/urandom`. - -To enable the shim, build DMD and Phobos with the environment variable -`LINUX_LEGACY_EMULATE_GETRANDOM` set to `1`. - -``` -cd phobos -LINUX_LEGACY_EMULATE_GETRANDOM=1 make -``` - -This functionality is a temporary fix and expected to be removed again soon -by an upcoming release (approx. v2.112.0 or v2.113.0). -The expected change is to replace the current “binding or shim” solution with -a syscall wrapper and automatic `/dev/urandom` fallback. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/changelog/entropy_system.dd new/phobos-2.112.1/changelog/entropy_system.dd --- old/phobos-2.112.0/changelog/entropy_system.dd 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/changelog/entropy_system.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,32 +0,0 @@ -Add an internal multi-backend entropy system - -This Phobos release introduces an internal multi-backend system for the -retrieval of entropy (as in cryptographically-secure random numbers obtained -from a suitable random number generator provided by the operating system). - -The current implementation supports the `getrandom` syscall on Linux. - -On BSD systems `arc4random_buf` or `getentropy` are used — depending on -which is implemented by the OS and powered by a secure (non-RC4) algorithm. - -Additionally, reading entropy from the character devices `/dev/urandom` and -`/dev/random` is available on all POSIX targets. - -On Windows `BCryptGenRandom` (from the -$(I Cryptography API: Next Generation (“BCrypt”))) is provided as a backend. -`CryptGenRandom` from the legacy $(I CryptoAPI) is not supported for the time -being. - -Furthermore, this replaces the `getrandom` backwards compatibility shim -that had been added by v2.111.1 for Linux targets. -Instead backwards compatibility is now provided by a hunt strategy algorithm -that tries potentially available entropy sources one by one to find one that -is available on the running system. -Given that the character devices serve as a fallback option here, -`urandom` is favored over `random`. That is because modern kernel versions — -where `random` would exhibit the usually more preferable behavior of blocking -only until the entropy pool has been initialized — will also provide the -`getrandom` syscall in the first place. Performing the syscall, in turn, is -even better as it does not depend on the runtime environment exposing the -special devices in predefined locations, thus working also within chroot -environments. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/changelog/unicode-17.dd new/phobos-2.112.1/changelog/unicode-17.dd --- old/phobos-2.112.0/changelog/unicode-17.dd 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/changelog/unicode-17.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,16 +0,0 @@ -std.uni has been upgraded from Unicode 16.0.0 to 17.0.0 - -This Unicode update was released September 9, 2025, and adds new blocks with characters. -See: https://www.unicode.org/versions/Unicode17.0.0/ - -``` -import std; - -void main() -{ - const alphaCount = iota(0, dchar.max).filter!(std.uni.isAlpha).walkLength; - writeln(alphaCount); - // formerly: 142759 - // now: 147421 -} -``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/changelog/uuidv7.dd new/phobos-2.112.1/changelog/uuidv7.dd --- old/phobos-2.112.0/changelog/uuidv7.dd 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/changelog/uuidv7.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,18 +0,0 @@ -Add uuid v7 support to `std.uuid` - -Add uuid v7 support to the UUID type located in `std.uuid`. -The first 48 bits of v7 stores the milliseconds since the unix epoch -(1970-01-01), additionally 74 bit are used to store random data. - -Example: ---- -SysTime st = DateTime(2025, 8, 19, 10, 38, 45); -UUID u = UUID(st); -SysTime o = u.v7Timestamp(); -assert(o == st); - -string s = u.toString(); -UUID u2 = UUID(s); -SysTime o2 = u2.v7Timestamp(); -assert(o2 == st); ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/changelog/write-text.dd new/phobos-2.112.1/changelog/write-text.dd --- old/phobos-2.112.0/changelog/write-text.dd 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/changelog/write-text.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -Add `writeText`, `writeWText`, and `writeDText` to `std.conv` - -These functions are variants of the existing `text`, `wtext`, and `dtext` -functions. Instead of returning a string, they write their output to an output -range. - -Like `text`, `writeText` can accept an -$(LINK2 $(ROOT_DIR)spec/istring.html, interpolated expression sequence) as an -argument. - -Example: - ---- -import std.conv : writeText; -import std.array : appender; - -auto output = appender!string(); -output.writeText(i"2 + 2 == $(2 + 2)"); -assert(output.data == "2 + 2 == 4"); ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/std/container/rbtree.d new/phobos-2.112.1/std/container/rbtree.d --- old/phobos-2.112.0/std/container/rbtree.d 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/std/container/rbtree.d 2026-02-28 23:32:55.000000000 +0100 @@ -755,7 +755,7 @@ * inserted after all existing duplicate elements. */ final class RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false) -if (is(typeof((ref const T a) => binaryFun!less(a, a)))) +if (isSuitablePredicate!(less, T)) { import std.meta : allSatisfy; import std.range : Take; @@ -2003,7 +2003,9 @@ } import std.range.primitives : isInputRange, ElementType; -import std.traits : isArray, isSomeString; +import std.traits : isArray, isSomeString, lvalueOf; + +private enum isSuitablePredicate(alias less, T) = is(typeof(binaryFun!less(lvalueOf!(const T), lvalueOf!(const T)))); /++ Convenience function for creating a `RedBlackTree!E` from a list of @@ -2028,14 +2030,14 @@ /++ Ditto +/ auto redBlackTree(alias less, E)(E[] elems...) -if (is(typeof(binaryFun!less(E.init, E.init)))) +if (isSuitablePredicate!(less, E)) { return new RedBlackTree!(E, less)(elems); } /++ Ditto +/ auto redBlackTree(alias less, bool allowDuplicates, E)(E[] elems...) -if (is(typeof(binaryFun!less(E.init, E.init)))) +if (isSuitablePredicate!(less, E)) { //We shouldn't need to instantiate less here, but for some reason, //dmd can't handle it if we don't (even though the template which @@ -2059,7 +2061,7 @@ /++ Ditto +/ auto redBlackTree(alias less, Stuff)(Stuff range) -if ( is(typeof(binaryFun!less((ElementType!Stuff).init, (ElementType!Stuff).init))) +if (isSuitablePredicate!(less, ElementType!Stuff) && isInputRange!Stuff && !isArray!(Stuff)) { return new RedBlackTree!(ElementType!Stuff, less)(range); @@ -2067,7 +2069,7 @@ /++ Ditto +/ auto redBlackTree(alias less, bool allowDuplicates, Stuff)(Stuff range) -if ( is(typeof(binaryFun!less((ElementType!Stuff).init, (ElementType!Stuff).init))) +if (isSuitablePredicate!(less, ElementType!Stuff) && isInputRange!Stuff && !isArray!(Stuff)) { //We shouldn't need to instantiate less here, but for some reason, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/std/internal/math/errorfunction.d new/phobos-2.112.1/std/internal/math/errorfunction.d --- old/phobos-2.112.0/std/internal/math/errorfunction.d 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/std/internal/math/errorfunction.d 2026-02-28 23:32:55.000000000 +0100 @@ -984,6 +984,9 @@ */ real normalDistributionImpl(real a) { + if (a is -real.infinity) return 0.0L; + if (a is real.infinity) return 1.0L; + real x = a * SQRT1_2; real z = fabs(x); @@ -1005,6 +1008,8 @@ { assert(fabs(normalDistributionImpl(1L) - (0.841344746068543L)) < 0.0000000000000005L); assert(isIdentical(normalDistributionImpl(NaN(0x325)), NaN(0x325))); +assert(normalDistributionImpl(-real.infinity) == 0.0L); +assert(normalDistributionImpl(real.infinity) == 1.0L); } /* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/std/internal/math/gammafunction.d new/phobos-2.112.1/std/internal/math/gammafunction.d --- old/phobos-2.112.0/std/internal/math/gammafunction.d 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/std/internal/math/gammafunction.d 2026-02-28 23:32:55.000000000 +0100 @@ -137,12 +137,19 @@ } /* - * Helper function: Incomplete gamma function computed by Temme's expansion. + * Regularized incomplete gamma function computed by Temme's expansion. If + * `compl` is true, it computes the complement of the regularized incomplete + * gamma function instead. + * + * For a derivation of the algorithm, see A "Set of Algorithms for the + * Incomplete Gamma Functions", N. M. Temme, Probability in the Engineering and + * Informational Sciences, Volume 8, Issue 2, April 1994, pp. 291-307, DOI: + * https://doi.org/10.1017/S0269964800003417. * * This is a port of igamma_temme_large from Boost. * */ -real igammaTemmeLarge(real a, real x) +real igammaTemmeLarge(real a, real x, bool compl) { static immutable real[][13] coef = [ [ -0.333333333333333333333L, 0.0833333333333333333333L, @@ -219,13 +226,12 @@ // avoid nans when one of the arguments is inf: if (x == real.infinity && a != real.infinity) - return 0; - + return compl ? 0.0L : 1.0L; if (x != real.infinity && a == real.infinity) - return 1; + return compl ? 1.0L : 0.0L; real sigma = (x - a) / a; - real phi = sigma - log(sigma + 1); + real phi = sigma - log1p(sigma); real y = a * phi; real z = sqrt(2 * phi); @@ -236,14 +242,40 @@ foreach (i; 0 .. coef.length) workspace[i] = poly(z, coef[i]); - real result = poly(1 / a, workspace); - result *= exp(-y) / sqrt(2 * PI * a); - if (x < a) - result = -result; + // Rₐ(𝜂) = [exp(-a𝜂²/2)/√(2𝜋a)]Sₐ(𝜂) + const r = exp(-y)/sqrt(2.0L*PI*a) * poly(1.0L/a, workspace); + + if (compl) + { + // Q(a,x) = erfc(+𝜂√(a/2))/2 + Rₐ(𝜂) + return erfc(+sgn(sigma)*sqrt(y))/2.0L + r; + } + else + { + // P(a,x) = erfc(-𝜂√(a/2))/2 - Rₐ(𝜂) + return erfc(-sgn(sigma)*sqrt(y))/2.0L - r; + } +} - result += erfc(sqrt(y)) / 2; +@safe unittest +{ + // Values were generated using scipy, which restricts values to double precision. + assert(feqrel(igammaTemmeLarge(25.0, 25.0, true), 0.47339_84685_56349_37L) >= double.mant_dig); + assert(feqrel(igammaTemmeLarge(25.0, 26.0, true), 0.39592_65699_99828_5L) >= double.mant_dig); + assert(feqrel(igammaTemmeLarge(26.0, 25.0, true), 0.55292_14200_24414_8L) >= double.mant_dig); + + assert(feqrel(igammaTemmeLarge(25.0, 25.0, false), 0.52660_15314_43650_6L) >= double.mant_dig); + assert(feqrel(igammaTemmeLarge(26.0, 25.0, false), 0.44707_85799_75585_2L) >= double.mant_dig); + + assert( + feqrel(igammaTemmeLarge(30.0L,31.0L,true), 1.0L-igammaTemmeLarge(30.0L,31.0L,false)) + >= real.mant_dig - 1); - return result; + assert(feqrel(igammaTemmeLarge(1e9, 1.1e9, false), 1.0) >= double.mant_dig); + assert(feqrel(igammaTemmeLarge(1.1e9, 1e9, false), 0.0) >= double.mant_dig); + + assert( + feqrel(igammaTemmeLarge(1e6, 1e6 + 1.0, true), 0.49946_80772_57932_46L) >= double.mant_dig); } } // private @@ -1660,6 +1692,9 @@ if ( (x > 1.0L) && (x > a ) ) return 1.0L - gammaIncompleteCompl(a,x); + if (a > 25.0L && abs(x-a) < 0.2L*a) + return igammaTemmeLarge(a, x, false); + real ax = a * log(x) - x - logGamma(a); /+ if ( ax < MINLOGL ) return 0; // underflow @@ -1701,7 +1736,7 @@ // log(x)-x = NaN when x = real.infinity const real MAXLOGL = 1.1356523406294143949492E4L; if (x > MAXLOGL) - return igammaTemmeLarge(a, x); + return igammaTemmeLarge(a, x, true); real ax = a * log(x) - x - logGamma(a); //const real MINLOGL = -1.1355137111933024058873E4L; @@ -1910,6 +1945,9 @@ assert(gammaIncompleteCompl(1, 0)==1); assert(gammaIncomplete(4545, real.infinity)==1); +// Value was generated using scipy, which restricts values to double precision. +assert(feqrel(gammaIncomplete(1e20, 1e20), 0.50000_00000_13298) >= double.mant_dig); + // Values from Excel's (1-GammaDist(x, alpha, 1, TRUE)) assert(fabs(1.0L-gammaIncompleteCompl(0.5L, 2) - 0.954499729507309L) < 0.00000005L); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/std/signals.d new/phobos-2.112.1/std/signals.d --- old/phobos-2.112.0/std/signals.d 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/std/signals.d 2026-02-28 23:32:55.000000000 +0100 @@ -66,11 +66,6 @@ import core.stdc.stdlib : calloc, realloc, free; import std.stdio; -// Special function for internal use only. -// Use of this is where the slot had better be a delegate -// to an object or an interface that is part of an object. -extern (C) Object _d_toObject(void* p); - // Used in place of Object.notifyRegister and Object.notifyUnRegister. alias DisposeEvt = void delegate(Object); extern (C) void rt_attachDisposeEvent( Object obj, DisposeEvt evt ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.112.0/std/socket.d new/phobos-2.112.1/std/socket.d --- old/phobos-2.112.0/std/socket.d 2025-12-09 12:21:05.000000000 +0100 +++ new/phobos-2.112.1/std/socket.d 2026-02-28 23:32:55.000000000 +0100 @@ -3510,7 +3510,7 @@ if (checkError) checkError.setMinCapacity(n); } - int result = .select(n, fr, fw, fe, &timeout.ctimeval); + int result = .select(n, fr, fw, fe, timeout !is null ? &timeout.ctimeval : null); version (Windows) {
