Hello community, here is the log from the commit of package dmd for openSUSE:Factory checked in at 2018-06-19 12:03:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dmd (Old) and /work/SRC/openSUSE:Factory/.dmd.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dmd" Tue Jun 19 12:03:22 2018 rev:16 rq:617146 version:2.080.1 Changes: -------- --- /work/SRC/openSUSE:Factory/dmd/dmd.changes 2018-05-13 16:04:57.790554895 +0200 +++ /work/SRC/openSUSE:Factory/.dmd.new/dmd.changes 2018-06-19 12:03:24.506600177 +0200 @@ -1,0 +2,20 @@ +Fri Jun 8 18:58:38 UTC 2018 - matthias.elias...@gmail.com + +- Update to 2.080.1 + - DMD Compiler regressions + * [REG 2.073] object initializer omitted when it should be included. + * [REG2.078-b1] case where && is not shortcut anymore in CTFE + * DMD segfault when doing unsafe operation outside of any function + - DMD Compiler bugs + * static foreach segfaults on __traits(allMembers) + * Access violation when generating JSON on static foreach + * DMD compilation crash + * -lib crashes on static libraries in the command line + - Phobos regressions + * [REG 2.080.0] Compiling byGrapheme Fails + * DMD "illegal hardware instruction" crash + * getSymbolsByUDA fails on AliasSeq members + - Druntime bugs + * core.internal.string has issues with radix + +------------------------------------------------------------------- Old: ---- dmd-2.080.0.tar.gz druntime-2.080.0.tar.gz phobos-2.080.0.tar.gz New: ---- dmd-2.080.1.tar.gz druntime-2.080.1.tar.gz phobos-2.080.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dmd.spec ++++++ --- /var/tmp/diff_new_pack.CcaqTL/_old 2018-06-19 12:03:26.054542703 +0200 +++ /var/tmp/diff_new_pack.CcaqTL/_new 2018-06-19 12:03:26.058542555 +0200 @@ -24,7 +24,7 @@ %define auto_bootstrap 1 %endif Name: dmd -Version: 2.080.0 +Version: 2.080.1 Release: 0 Summary: D Programming Language 2.0 License: BSL-1.0 @@ -94,7 +94,7 @@ %setup -q %setup -q -T -D -a 1 %setup -q -T -D -a 2 -%patch0 -p0 +%patch0 echo %{version} > phobos-%{version}/VERSION cd %{_builddir} ln -s dmd-%{version} dmd ++++++ dmd-2.080.0.tar.gz -> dmd-2.080.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/VERSION new/dmd-2.080.1/VERSION --- old/dmd-2.080.0/VERSION 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/VERSION 2018-06-07 17:24:58.000000000 +0200 @@ -1 +1 @@ -v2.080.0 +v2.080.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/deprecate_class_allocators.dd new/dmd-2.080.1/changelog/deprecate_class_allocators.dd --- old/dmd-2.080.0/changelog/deprecate_class_allocators.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/deprecate_class_allocators.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,50 +0,0 @@ -Class allocators and deallocators have been deprecated - -Class allocators and deallocators have been planned for deprecation for years. Starting with this release the following code will emit deprecation messages. - ---- -class C -{ - new(size_t size) // deprecation message - { - return malloc(size); - } - - delete(void* obj) // deprecation message - { - free(obj); - } -} ---- - -See the $(LINK2 $(ROOT_DIR)deprecate.html#Class%20allocators%20and%20deallocators, Deprecated Features) for more information. - -Many alternatives for class allocators/deallcators exist. Among them is the generic $(REF make, std,experimental,allocator) and $(REF dispose, std,experimental,allocator) from the allocator package. For other alternatives, see $(LINK2 https://dlang.org/blog/the-gc-series, the recent article about memory allocation on the DBlog) and $(LINK2 https://wiki.dlang.org/Memory_Management, the D Wiki memory management article). - -Users have leveraged allocators in order to disable GC allocation, as illustrated in the following example: - ---- -class C -{ - @disable new(size_t size); -} - -void main() -{ - auto c = new C(); // Error: allocator `new` is not callable because it is annotated with `@disable` -} ---- - -That idiom will remain, but has been enhanced with this release to no longer require the `size_t` argument. That is, starting with this release, the following syntax is also permitted: - ---- -class C -{ - @disable new(); -} - -void main() -{ - auto c = new C(); // Error: allocator `new` is not callable because it is annotated with `@disable` -} ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/deprecate_double_initialization.dd new/dmd-2.080.1/changelog/deprecate_double_initialization.dd --- old/dmd-2.080.0/changelog/deprecate_double_initialization.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/deprecate_double_initialization.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,47 +0,0 @@ -Deprecate double initialization of immutable fields inside constructor - -Inside a constructor scope, assigning to aggregate declaration (class/struct) -members is done by considering the first assignment as initialization and -subsequent assignments as modifications of the initially constructed object. -For `const`/`immutable` fields the initialization is accepted in the constructor, -but subsequent modifications are not. Example: - ---- -struct A -{ - int a; - immutable int b; - this(int a, int b) - { - this.a = a; - this.b = b; - - this.a = 7; // OK, a is mutable - this.b = 9; // Error: immutable field b initialized multiple times - } -} ---- - -However, $(BUGZILLA 18719) shows that this rule does not apply when inside -a constructor scope there is a call to a different constructor: - ---- -struct A -{ - immmutable int a; - this() - { - this(42); - this.a = 5; // second initialization of immutable field - } - - this(int a) - { - this.a = a; - } -} ---- - -The above code wrongfully compiled succesfully before this patch, accepting the double -initialization of the `immutable` field `a`. After this patch, `this.a = 5` will issue -a deprecation warning stating that `a` is initialized multiple times. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/fix18736.dd new/dmd-2.080.1/changelog/fix18736.dd --- old/dmd-2.080.0/changelog/fix18736.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/fix18736.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,25 +0,0 @@ -Issue 18736 - constructor calls allowed after case labels - -Delegating constructor calls are not allowed after labels, -but case labels and default labels should also count as labels. - ---- -class A -{ - this(char c) { } - - this(int i) - { - switch (i) - { - case 1: break; - default: break; - } - this('c'); // now gives an error - } -} ---- - -This is necessary so the compiler can guarantee that each -field is initialized exactly once. To get code like the above -to pass the compiler, replace it with an if-then sequence. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/fix5227.dd new/dmd-2.080.1/changelog/fix5227.dd --- old/dmd-2.080.0/changelog/fix5227.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/fix5227.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -fix Issue 5227 - X ^^ FP at compile-time - -The pow operator `^^` can now be used by CTFE. - -Adds these std.math functions to those that can be used by CTFE: - -round -floor -ceil -trunc -log -log2 -log10 -pow -expm1 -exp2 -fmin -fmax -copysign -fma diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/isReturnOnStack.dd new/dmd-2.080.1/changelog/isReturnOnStack.dd --- old/dmd-2.080.0/changelog/isReturnOnStack.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/isReturnOnStack.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,5 +0,0 @@ -add __traits(isReturnOnStack, func) - -Determines if a function's return value is placed on the stack, -or is returned via registers. -For more details, see $(LINK2 $(ROOT_DIR)spec/traits.html#isReturnOnStack, isReturnOnStack). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/objc_class_methods.dd new/dmd-2.080.1/changelog/objc_class_methods.dd --- old/dmd-2.080.0/changelog/objc_class_methods.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/objc_class_methods.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,45 +0,0 @@ -Support for calling Objective-C class (static) methods has been added. - -Previously to call an Objective-C class method it was necessary to make explicit -calls to the Objective-C runtime. The following code is an example of the old -way to call a class method: - ---- -extern (C) Class objc_lookUpClass(in char* name); - -extern (Objective-C) -interface Class -{ - NSObject alloc() @selector("alloc"); -} - -extern (Objective-C) -interface NSObject -{ - NSObject init() @selector("init"); -} - -void main() -{ - auto cls = objc_lookUpClass("NSObject"); - auto o = cls.alloc().init(); -} ---- - -The above code can now be replaced with the following: - ---- -extern (Objective-C) -interface NSObject -{ - static NSObject alloc() @selector("alloc"); - NSObject init() @selector("init"); -} - -void main() -{ - auto o = NSObject.alloc().init(); -} ---- - -Note the use of the `static` attribute in the method declaration. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/postblitQualifiers.dd new/dmd-2.080.1/changelog/postblitQualifiers.dd --- old/dmd-2.080.0/changelog/postblitQualifiers.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/postblitQualifiers.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,28 +0,0 @@ -Deprecate the use of a `const`/`immutable`/`shared` postblit - -Before this patch, if a postblit was declared `const`/`immutable`/`shared` -the compiler would have accepted the declaration but there would have -been no way of calling the postblit succesfully, except for const due -to the implicit conversion mutable -> const. Even though calling a -const posblit is possible, there is no way to modify the fields of the -newly copied struct: - ---- -struct S -{ - int n - this(this) const - { - ++n; // Error: cannot modify this.n in const method - } -} - -void main() -{ - S a; - auto a2 = a; -} ---- - -With this release, if a postblit contains `const`/`immutable`/`shared` in -its signature, a deprecation message will be emitted. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/rwm-shared-error.dd new/dmd-2.080.1/changelog/rwm-shared-error.dd --- old/dmd-2.080.0/changelog/rwm-shared-error.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/rwm-shared-error.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,16 +0,0 @@ -The deprecation for read-modify-write operations on `shared` variables has ended - -Read-modify-write operations are not allowed for `shared` variables: - ---- -shared int i; -i++; // Error: read-modify-write operations are not allowed for shared variables ---- - -Use $(REF atomicOp, core, atomic) instead: - ---- -import core.atomic : atomicOp; -shared int i; -atomicOp!"+="(i, 1); ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/changelog/switch-skip-declaration.dd new/dmd-2.080.1/changelog/switch-skip-declaration.dd --- old/dmd-2.080.0/changelog/switch-skip-declaration.dd 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/changelog/switch-skip-declaration.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,39 +0,0 @@ -The deprecation for `switch` cases which skip the declaration of a variable has ended - -Usage of a variable which is declared in another `switch` case now results in an error. - ---- -int i = 2; -switch (i) -{ - case 1: - { - int j; - case 2: - j++; - j.writeln; // BUG: j is not initialized and e.g. prints -321532879 - break; - } - default: - break; -} ---- - -If this behavior is wanted, it can explicitly requested by using `void` initialization: - ---- -int i = 2; -switch (i) -{ - case 1: - { - int j = void; - case 2: - j = 2; - j.writeln; - break; - } - default: - break; -} ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/attrib.d new/dmd-2.080.1/src/dmd/attrib.d --- old/dmd-2.080.0/src/dmd/attrib.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/attrib.d 2018-06-07 17:24:58.000000000 +0200 @@ -928,7 +928,8 @@ extern (C++) final class StaticIfDeclaration : ConditionalDeclaration { ScopeDsymbol scopesym; - bool addisdone; + private bool addisdone = false; // true if members have been added to scope + private bool onStack = false; // true if a call to `include` is currently active extern (D) this(Condition condition, Dsymbols* decl, Dsymbols* elsedecl) { @@ -950,8 +951,10 @@ { //printf("StaticIfDeclaration::include(sc = %p) scope = %p\n", sc, scope); - if (errors) + if (errors || onStack) return null; + onStack = true; + scope(exit) onStack = false; if (condition.inc == 0) { @@ -1039,6 +1042,7 @@ of the first call. We need both `cached` and `cache`, because `null` is a valid value for `cache`. +/ + bool onStack = false; bool cached = false; Dsymbols* cache = null; @@ -1073,14 +1077,20 @@ override Dsymbols* include(Scope* sc) { - if (errors) + if (errors || onStack) return null; - if (cached) { + assert(!onStack); return cache; } - sfe.prepare(_scope); // lower static foreach aggregate + onStack = true; + scope(exit) onStack = false; + + if (_scope) + { + sfe.prepare(_scope); // lower static foreach aggregate + } if (!sfe.ready()) { return null; // TODO: ok? diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/attrib.h new/dmd-2.080.1/src/dmd/attrib.h --- old/dmd-2.080.0/src/dmd/attrib.h 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/attrib.h 2018-06-07 17:24:58.000000000 +0200 @@ -178,6 +178,7 @@ public: ScopeDsymbol *scopesym; bool addisdone; + bool onStack; Dsymbol *syntaxCopy(Dsymbol *s); Dsymbols *include(Scope *sc); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/clone.d new/dmd-2.080.1/src/dmd/clone.d --- old/dmd-2.080.0/src/dmd/clone.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/clone.d 2018-06-07 17:24:58.000000000 +0200 @@ -765,7 +765,11 @@ const(char)* code = "size_t h = 0;" ~ "foreach (i, T; typeof(p.tupleof))" ~ - " h = h * 33 + typeid(T).getHash(cast(const void*)&p.tupleof[i]);" ~ + // workaround https://issues.dlang.org/show_bug.cgi?id=17968 + " static if(is(T* : const(Object)*)) " ~ + " h = h * 33 + typeid(const(Object)).getHash(cast(const void*)&p.tupleof[i]);" ~ + " else " ~ + " h = h * 33 + typeid(T).getHash(cast(const void*)&p.tupleof[i]);" ~ "return h;"; fop.fbody = new CompileStatement(loc, new StringExp(loc, cast(char*)code)); Scope* sc2 = sc.push(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/cond.d new/dmd-2.080.1/src/dmd/cond.d --- old/dmd-2.080.0/src/dmd/cond.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/cond.d 2018-06-07 17:24:58.000000000 +0200 @@ -416,7 +416,7 @@ */ final extern(D) bool ready() { - return aggrfe && aggrfe.aggr && aggrfe.aggr.type.toBasetype().ty == Ttuple; + return aggrfe && aggrfe.aggr && aggrfe.aggr.type && aggrfe.aggr.type.toBasetype().ty == Ttuple; } } @@ -816,7 +816,6 @@ extern (C++) final class StaticIfCondition : Condition { Expression exp; - int nest; // limit circular dependencies extern (D) this(const ref Loc loc, Expression exp) { @@ -842,11 +841,6 @@ if (inc == 0) { - if (exp.op == TOK.error || nest > 100) - { - error(loc, (nest > 1000) ? "unresolvable circular `static if` expression" : "error evaluating `static if` expression"); - return errorReturn(); - } if (!sc) { error(loc, "`static if` conditional cannot be at global scope"); @@ -854,14 +848,12 @@ return 0; } - ++nest; sc = sc.push(sc.scopesym); import dmd.staticcond; bool errors; bool result = evalStaticCondition(sc, exp, exp, errors); sc.pop(); - --nest; // Prevent repeated condition evaluation. // See: fail_compilation/fail7815.d if (inc != 0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/constfold.d new/dmd-2.080.1/src/dmd/constfold.d --- old/dmd-2.080.0/src/dmd/constfold.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/constfold.d 2018-06-07 17:24:58.000000000 +0200 @@ -1339,8 +1339,11 @@ uinteger_t iupr = upr.toInteger(); if (iupr > es1.len || ilwr > iupr) { - e1.error("string slice `[%llu .. %llu]` is out of bounds", ilwr, iupr); - emplaceExp!(ErrorExp)(&ue); + // https://issues.dlang.org/show_bug.cgi?id=18115 + emplaceExp!(CTFEExp)(&ue, TOK.cantExpression); + return ue; + //e1.error("string slice `[%llu .. %llu]` is out of bounds", ilwr, iupr); + //emplaceExp!(ErrorExp)(&ue); } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/dinterpret.d new/dmd-2.080.1/src/dmd/dinterpret.d --- old/dmd-2.080.0/src/dmd/dinterpret.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/dinterpret.d 2018-06-07 17:24:58.000000000 +0200 @@ -4827,17 +4827,23 @@ { assert(e.arguments.dim == 1); Expression ea = (*e.arguments)[0]; - //printf("1 ea = %s %s\n", ea.type.toChars(), ea.toChars()); + // printf("1 ea = %s %s\n", ea.type.toChars(), ea.toChars()); if (ea.op == TOK.slice) ea = (cast(SliceExp)ea).e1; if (ea.op == TOK.cast_) ea = (cast(CastExp)ea).e1; - //printf("2 ea = %s, %s %s\n", ea.type.toChars(), Token::toChars(ea.op), ea.toChars()); + // printf("2 ea = %s, %s %s\n", ea.type.toChars(), Token.toChars(ea.op), ea.toChars()); if (ea.op == TOK.variable || ea.op == TOK.symbolOffset) result = getVarExp(e.loc, istate, (cast(SymbolExp)ea).var, ctfeNeedRvalue); else if (ea.op == TOK.address) result = interpret((cast(AddrExp)ea).e1, istate); + + // https://issues.dlang.org/show_bug.cgi?id=18871 + // https://issues.dlang.org/show_bug.cgi?id=18819 + else if (ea.op == TOK.arrayLiteral) + result = interpret(cast(ArrayLiteralExp)ea, istate); + else assert(0); if (CTFEExp.isCantExp(result)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/dstruct.d new/dmd-2.080.1/src/dmd/dstruct.d --- old/dmd-2.080.0/src/dmd/dstruct.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/dstruct.d 2018-06-07 17:24:58.000000000 +0200 @@ -484,7 +484,7 @@ { if ((stype.alignment() < Target.ptrsize || (v.offset & (Target.ptrsize - 1))) && - sc.func.setUnsafe()) + (sc.func && sc.func.setUnsafe())) { .error(loc, "field `%s.%s` cannot assign to misaligned pointers in `@safe` code", toChars(), v.toChars()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/expression.d new/dmd-2.080.1/src/dmd/expression.d --- old/dmd-2.080.0/src/dmd/expression.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/expression.d 2018-06-07 17:24:58.000000000 +0200 @@ -2119,7 +2119,7 @@ if (v.type.ty == Tstruct) { - StructDeclaration sd = (cast(TypeStruct)type).sym; + StructDeclaration sd = (cast(TypeStruct)v.type).sym; if (sd.hasNoFields) return false; } @@ -2560,6 +2560,11 @@ { return new IntegerExp(loc, value, type); } + + static IntegerExp createi(Loc loc, int value, Type type) + { + return new IntegerExp(loc, value, type); + } override bool equals(RootObject o) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/expression.h new/dmd-2.080.1/src/dmd/expression.h --- old/dmd-2.080.0/src/dmd/expression.h 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/expression.h 2018-06-07 17:24:58.000000000 +0200 @@ -226,6 +226,7 @@ dinteger_t value; static IntegerExp *create(Loc loc, dinteger_t value, Type *type); + static IntegerExp *createi(Loc loc, int value, Type *type); bool equals(RootObject *o); dinteger_t toInteger(); real_t toReal(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/func.d new/dmd-2.080.1/src/dmd/func.d --- old/dmd-2.080.0/src/dmd/func.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/func.d 2018-06-07 17:24:58.000000000 +0200 @@ -2197,7 +2197,7 @@ */ static FuncDeclaration genCfunc(Parameters* fparams, Type treturn, const(char)* name, StorageClass stc = 0) { - return genCfunc(fparams, treturn, Identifier.idPool(name, strlen(name)), stc); + return genCfunc(fparams, treturn, Identifier.idPool(name, cast(uint)strlen(name)), stc); } static FuncDeclaration genCfunc(Parameters* fparams, Type treturn, Identifier id, StorageClass stc = 0) @@ -2570,9 +2570,8 @@ Match m; m.last = MATCH.nomatch; - - const(char)* failMessage; - functionResolve(&m, s, loc, sc, tiargs, tthis, fargs, &failMessage); + functionResolve(&m, s, loc, sc, tiargs, tthis, fargs, null); + auto orig_s = s; if (m.last > MATCH.nomatch && m.lastf) { @@ -2699,6 +2698,9 @@ .error(loc, "%s `%s%s%s` is not callable using argument types `%s`", fd.kind(), fd.toPrettyChars(), parametersTypeToChars(tf.parameters, tf.varargs), tf.modToChars(), fargsBuf.peekString()); + // re-resolve to check for supplemental message + const(char)* failMessage; + functionResolve(&m, orig_s, loc, sc, tiargs, tthis, fargs, &failMessage); if (failMessage) errorSupplemental(loc, failMessage); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/identifier.d new/dmd-2.080.1/src/dmd/identifier.d --- old/dmd-2.080.0/src/dmd/identifier.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/identifier.d 2018-06-07 17:24:58.000000000 +0200 @@ -143,10 +143,10 @@ */ extern (D) static Identifier idPool(const(char)[] s) { - return idPool(s.ptr, s.length); + return idPool(s.ptr, cast(uint)s.length); } - static Identifier idPool(const(char)* s, size_t len) + static Identifier idPool(const(char)* s, uint len) { StringValue* sv = stringtable.update(s, len); Identifier id = cast(Identifier)sv.ptrvalue; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/identifier.h new/dmd-2.080.1/src/dmd/identifier.h --- old/dmd-2.080.0/src/dmd/identifier.h 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/identifier.h 2018-06-07 17:24:58.000000000 +0200 @@ -16,6 +16,7 @@ #endif /* __DMC__ */ #include "root.h" +#include "rmem.h" #include "stringtable.h" class Identifier : public RootObject @@ -38,7 +39,7 @@ static StringTable stringtable; static Identifier *generateId(const char *prefix); static Identifier *generateId(const char *prefix, size_t i); - static Identifier *idPool(const char *s, size_t len); + static Identifier *idPool(const char *s, unsigned len); static inline Identifier *idPool(const char *s) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/initsem.d new/dmd-2.080.1/src/dmd/initsem.d --- old/dmd-2.080.0/src/dmd/initsem.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/initsem.d 2018-06-07 17:24:58.000000000 +0200 @@ -12,6 +12,7 @@ module dmd.initsem; +import core.stdc.stdio; import core.checkedint; import dmd.aggregate; @@ -192,7 +193,7 @@ { if ((t.alignment() < Target.ptrsize || (vd.offset & (Target.ptrsize - 1))) && - sc.func.setUnsafe()) + sc.func && sc.func.setUnsafe()) { error(i.loc, "field `%s.%s` cannot assign to misaligned pointers in `@safe` code", sd.toChars(), vd.toChars()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/lexer.d new/dmd-2.080.1/src/dmd/lexer.d --- old/dmd-2.080.0/src/dmd/lexer.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/lexer.d 2018-06-07 17:24:58.000000000 +0200 @@ -494,7 +494,7 @@ } break; } - Identifier id = Identifier.idPool(cast(char*)t.ptr, p - t.ptr); + Identifier id = Identifier.idPool(cast(char*)t.ptr, cast(uint)(p - t.ptr)); t.ident = id; t.value = cast(TOK)id.getValue(); anyToken = 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/mars.d new/dmd-2.080.1/src/dmd/mars.d --- old/dmd-2.080.0/src/dmd/mars.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/mars.d 2018-06-07 17:24:58.000000000 +0200 @@ -666,7 +666,7 @@ /* At this point, name is the D source file name stripped of * its path and extension. */ - auto id = Identifier.idPool(name, strlen(name)); + auto id = Identifier.idPool(name, cast(uint)strlen(name)); auto m = new Module(files[i], id, global.params.doDocComments, global.params.doHdrGeneration); modules.push(m); if (firstmodule) @@ -890,6 +890,11 @@ Library library = null; if (global.params.lib) { + if (global.params.objfiles.dim == 0) + { + error(Loc.initial, "no input files"); + return EXIT_FAILURE; + } library = Library.factory(); library.setFilename(global.params.objdir, global.params.libname); // Add input object and input library files to output library @@ -2479,7 +2484,7 @@ if (*modulePattern == '.') { assert(modulePattern > idStart, "empty module pattern"); - *dst = MatcherNode(Identifier.idPool(idStart, modulePattern - idStart)); + *dst = MatcherNode(Identifier.idPool(idStart, cast(uint)(modulePattern - idStart))); modulePattern++; idStart = modulePattern; break; @@ -2491,7 +2496,7 @@ if (*modulePattern == '\0') { assert(modulePattern > idStart, "empty module pattern"); - *lastNode = MatcherNode(Identifier.idPool(idStart, modulePattern - idStart)); + *lastNode = MatcherNode(Identifier.idPool(idStart, cast(uint)(modulePattern - idStart))); break; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/dmd/mtype.d new/dmd-2.080.1/src/dmd/mtype.d --- old/dmd-2.080.0/src/dmd/mtype.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/dmd/mtype.d 2018-06-07 17:24:58.000000000 +0200 @@ -4782,6 +4782,8 @@ // arguments get specially formatted private const(char)* getParamError(const(char)* format, Expression arg, Parameter par) { + if (global.gag && !global.params.showGaggedErrors) + return null; // show qualification when toChars() is the same but types are different auto at = arg.type.toChars(); bool qual = !arg.type.equals(par.type) && strcmp(at, par.type.toChars()) == 0; @@ -5627,7 +5629,7 @@ /* Look for what user might have intended */ const p = mutableOf().unSharedOf().toChars(); - auto id = Identifier.idPool(p, strlen(p)); + auto id = Identifier.idPool(p, cast(uint)strlen(p)); if (const n = importHint(p)) error(loc, "`%s` is not defined, perhaps `import %s;` ?", p, n); else if (auto s2 = sc.search_correct(id)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/src/tests/cxxfrontend.c new/dmd-2.080.1/src/tests/cxxfrontend.c --- old/dmd-2.080.0/src/tests/cxxfrontend.c 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/src/tests/cxxfrontend.c 2018-06-07 17:24:58.000000000 +0200 @@ -154,7 +154,7 @@ Loc loc; Identifier *ident = Identifier::idPool("test"); - IntegerExp *ie = IntegerExp::create(loc, 42, Type::tint32); + IntegerExp *ie = IntegerExp::createi(loc, 42, Type::tint32); ie->accept(&tv); assert(tv.expr == true); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/extra-files/json.out new/dmd-2.080.1/test/compilable/extra-files/json.out --- old/dmd-2.080.0/test/compilable/extra-files/json.out 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/test/compilable/extra-files/json.out 2018-06-07 17:24:58.000000000 +0200 @@ -923,6 +923,20 @@ "line": 194, "linkage": "objc", "name": "flinkageObjc" + }, + { + "char": 7, + "kind": "template", + "line": 196, + "members": [], + "name": "test18211", + "parameters": [ + { + "deco": "VALUE_REMOVED_FOR_TEST", + "kind": "value", + "name": "n" + } + ] } ], "name": "json" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/json.d new/dmd-2.080.1/test/compilable/json.d --- old/dmd-2.080.0/test/compilable/json.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/test/compilable/json.d 2018-06-07 17:24:58.000000000 +0200 @@ -192,3 +192,12 @@ extern(Windows) int flinkageWindows(); extern(Pascal) int flinkagePascal(); extern(Objective-C) int flinkageObjc(); + +mixin template test18211(int n) +{ + static foreach (i; 0 .. n>10 ? 10 : n) + { + mixin("enum x" ~ cast(char)('0' + i)); + } + static if (true) {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test11169.d new/dmd-2.080.1/test/compilable/test11169.d --- old/dmd-2.080.0/test/compilable/test11169.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/test/compilable/test11169.d 2018-06-07 17:24:58.000000000 +0200 @@ -43,3 +43,18 @@ static assert(!__traits(compiles, { auto b = new B2(); })); static assert(!__traits(compiles, { auto b = new B3(); })); } + +class B : A +{ + // __traits(isAbstractClass) is not usable in static if condition. + static assert (!__traits(isAbstractClass, typeof(this))); + + override void foo() + { + } +} + +void main2() +{ + B b = new B(); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test17819.d new/dmd-2.080.1/test/compilable/test17819.d --- old/dmd-2.080.0/test/compilable/test17819.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/compilable/test17819.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,19 @@ +static if (__traits(allMembers, __traits(parent,{}))[0]=="object") { + pragma(msg, "compiled in!"); + enum test = 0; +} + +static foreach (m; __traits(allMembers, __traits(parent,{}))) { + pragma(msg, m.stringof); + mixin("enum new"~m~"=`"~m~"`;"); +} + +static assert([__traits(allMembers, __traits(parent,{}))] == ["object", "test", "newobject", "newWorld", "newBuildStuff", "World", "BuildStuff"]); + +struct World { + mixin BuildStuff; +} + +template BuildStuff() { + static foreach(elem; __traits(allMembers, typeof(this))) {} +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test18115.d new/dmd-2.080.1/test/compilable/test18115.d --- old/dmd-2.080.0/test/compilable/test18115.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/compilable/test18115.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,10 @@ +// https://issues.dlang.org/show_bug.cgi?id=18115 + +int test() +{ + if (test.stringof.length > 6 && + test.stringof[$-7..$] == "1234567") {} + return 0; +} + +enum a = test(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test18821.d new/dmd-2.080.1/test/compilable/test18821.d --- old/dmd-2.080.0/test/compilable/test18821.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/compilable/test18821.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,10 @@ +// https://issues.dlang.org/show_bug.cgi?id=18821 + +align(1) struct epoll_event +{ + void* ptr; +} +template isAllZeroBits(epoll_event value) {} +alias isInitAllZeroBits = isAllZeroBits!(epoll_event.init); + +epoll_event e = { null }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test18871.d new/dmd-2.080.1/test/compilable/test18871.d --- old/dmd-2.080.0/test/compilable/test18871.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/compilable/test18871.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,15 @@ +// https://issues.dlang.org/show_bug.cgi?id=18871 +// and https://issues.dlang.org/show_bug.cgi?id=18819 + +struct Problem +{ + ~this() {} +} +struct S +{ + Problem[1] payload; +} +enum theTemplateB = { + static foreach (e; S.init.tupleof) {} + return true; +}(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test7815.d new/dmd-2.080.1/test/compilable/test7815.d --- old/dmd-2.080.0/test/compilable/test7815.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/compilable/test7815.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,65 @@ +// REQUIRED_ARGS: -o- +/* +TEST_OUTPUT: +--- +--- +*/ + +mixin template Helpers() +{ + static if (is(Flags!Move)) + { + Flags!Move flags; + } + else + { + pragma(msg, "X: ", __traits(derivedMembers, Flags!Move)); + } +} + +template Flags(T) +{ + mixin({ + int defs = 1; + foreach (name; __traits(derivedMembers, Move)) + { + defs++; + } + if (defs) + { + return "struct Flags { bool x; }"; + } + else + { + return ""; + } + }()); +} + +struct Move +{ + int a; + mixin Helpers!(); +} + +enum a7815 = Move.init.flags; + +/+ +This originally was an invalid case: +When the Move struct member is analyzed: +1. mixin Helpers!() is instantiated. +2. In Helpers!(), static if and its condition is(Flags!Move)) evaluated. +3. In Flags!Move, string mixin evaluates and CTFE lambda. +4. __traits(derivedMembers, Move) tries to see the member of Move. + 4a. mixin Helpers!() member is analyzed. + 4b. `static if (is(Flags!Move))` in Helpers!() is evaluated + 4c. The Flags!Move instantiation is already in progress, so it cannot be resolved. + 4d. `static if` fails because Flags!Move cannot be determined as a type. +5. __traits(derivedMembers, Move) returns a 1-length tuple("a"). +6. The lambda in Flags!Move returns a string "struct Flags {...}", then + Flags!Move is instantiated to a new struct Flags. +7. Finally Move struct does not have flags member, then the `enum a7815` + definition will fail in its initializer. + +Now, static if will behave like a string mixin: it is invisible during its own expansion. ++/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/compilable/test7886.d new/dmd-2.080.1/test/compilable/test7886.d --- old/dmd-2.080.0/test/compilable/test7886.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/compilable/test7886.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,5 @@ +// 7886 + +struct A { + static assert (__traits(derivedMembers, A).length == 0); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/fail_compilation/fail11169.d new/dmd-2.080.1/test/fail_compilation/fail11169.d --- old/dmd-2.080.0/test/fail_compilation/fail11169.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/test/fail_compilation/fail11169.d 1970-01-01 01:00:00.000000000 +0100 @@ -1,28 +0,0 @@ -/* -TEST_OUTPUT: ---- -fail_compilation/fail11169.d(16): Error: error evaluating `static if` expression ---- -*/ - -class A -{ - abstract void foo(); -} - -class B : A -{ - // __traits(isAbstractClass) is not usable in static if condition. - static if (__traits(isAbstractClass, typeof(this))) - { - } - - override void foo() - { - } -} - -void main() -{ - B b = new B(); -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/fail_compilation/fail7815.d new/dmd-2.080.1/test/fail_compilation/fail7815.d --- old/dmd-2.080.0/test/fail_compilation/fail7815.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/test/fail_compilation/fail7815.d 1970-01-01 01:00:00.000000000 +0100 @@ -1,65 +0,0 @@ -// REQUIRED_ARGS: -o- -/* -TEST_OUTPUT: ---- -X: tuple("x") -fail_compilation/fail7815.d(47): Error: no property `flags` for type `Move` ---- -*/ - -mixin template Helpers() -{ - static if (is(Flags!Move)) - { - Flags!Move flags; - } - else - { - pragma(msg, "X: ", __traits(derivedMembers, Flags!Move)); - } -} - -template Flags(T) -{ - mixin({ - int defs = 1; - foreach (name; __traits(derivedMembers, Move)) - { - defs++; - } - if (defs) - { - return "struct Flags { bool x; }"; - } - else - { - return ""; - } - }()); -} - -struct Move -{ - int a; - mixin Helpers!(); -} - -enum a7815 = Move.init.flags; - -/+ -This is an invalid case. -When the Move struct member is analyzed: -1. mixin Helpers!() is instantiated. -2. In Helpers!(), static if and its condition is(Flags!Move)) evaluated. -3. In Flags!Move, string mixin evaluates and CTFE lambda. -4. __traits(derivedMembers, Move) tries to see the member of Move. - 4a. mixin Helpers!() member is analyzed. - 4b. `static if (is(Flags!Move))` in Helpers!() is evaluated - 4c. The Flags!Move instantiation is already in progress, so it cannot be resolved. - 4d. `static if` fails because Flags!Move cannot be determined as a type. -5. __traits(derivedMembers, Move) returns a 1-length tuple("a"). -6. The lambda in Flags!Move returns a string "struct Flags {...}", then - Flags!Move is instantiated to a new struct Flags. -7. Finally Move struct does not have flags member, then the `enum a7815` - definition will fail in its initializer. -+/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/fail_compilation/fail7886.d new/dmd-2.080.1/test/fail_compilation/fail7886.d --- old/dmd-2.080.0/test/fail_compilation/fail7886.d 2018-05-01 15:42:29.000000000 +0200 +++ new/dmd-2.080.1/test/fail_compilation/fail7886.d 1970-01-01 01:00:00.000000000 +0100 @@ -1,5 +0,0 @@ -// 7886 - -struct A { - static if (__traits(derivedMembers, A).length) {} -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/runnable/extra-files/test17968.d new/dmd-2.080.1/test/runnable/extra-files/test17968.d --- old/dmd-2.080.0/test/runnable/extra-files/test17968.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/runnable/extra-files/test17968.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,12 @@ +import test17968a; + +void main() +{ + auto r = fun2.fun1; + // just check that getHash works (doesn't throw). + typeid(r).getHash(&r); + + // try gethash when member is null. + r.t = null; + typeid(r).getHash(&r); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/runnable/extra-files/test17968a.d new/dmd-2.080.1/test/runnable/extra-files/test17968a.d --- old/dmd-2.080.0/test/runnable/extra-files/test17968a.d 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/runnable/extra-files/test17968a.d 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,16 @@ +struct S(T) +{ + T t; +} + +class C(T) { } + +auto fun1(T)(T t) +{ + return S!T(t); +} + +auto fun2() +{ + return new C!int; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/runnable/test17968.sh new/dmd-2.080.1/test/runnable/test17968.sh --- old/dmd-2.080.0/test/runnable/test17968.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/runnable/test17968.sh 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + + +$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}a${OBJ} -c ${EXTRA_FILES}${SEP}test17968a.d +$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${EXE} ${EXTRA_FILES}${SEP}test17968.d ${OUTPUT_BASE}a${OBJ} + +${OUTPUT_BASE}${EXE} + +rm ${OUTPUT_BASE}{a${OBJ},${EXE}} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dmd-2.080.0/test/runnable/test18902.sh new/dmd-2.080.1/test/runnable/test18902.sh --- old/dmd-2.080.0/test/runnable/test18902.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/dmd-2.080.1/test/runnable/test18902.sh 2018-06-07 17:24:58.000000000 +0200 @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# dmd -lib should fail without input sources/object files +if $DMD -m${MODEL} -lib 18902.a; then + exit 1 +else + [ $? -eq 1 ] +fi ++++++ druntime-2.080.0.tar.gz -> druntime-2.080.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/druntime-2.080.0/src/core/internal/string.d new/druntime-2.080.1/src/core/internal/string.d --- old/druntime-2.080.0/src/core/internal/string.d 2018-04-17 11:34:24.000000000 +0200 +++ new/druntime-2.080.1/src/core/internal/string.d 2018-05-25 04:35:15.000000000 +0200 @@ -17,6 +17,10 @@ char[] unsignedToTempString(ulong value, return char[] buf, uint radix = 10) @safe { + if (radix < 2) + // not a valid radix, just return an empty string + return buf[$ .. $]; + size_t i = buf.length; do { @@ -74,6 +78,10 @@ assert(long.sizeof.unsignedToTempString == "8"); assert(uint.max.unsignedToTempString == "4294967295"); assert(ulong.max.unsignedToTempString == "18446744073709551615"); + + // test bad radices + assert(100.unsignedToTempString(buf, 1) == ""); + assert(100.unsignedToTempString(buf, 0) == ""); } alias SignedStringBuf = char[20]; @@ -151,7 +159,7 @@ * Returns: * number of digits */ -int numDigits(uint radix = 10)(ulong value) @safe +int numDigits(uint radix = 10)(ulong value) @safe if (radix >= 2 && radix <= 36) { int n = 1; while (1) @@ -197,6 +205,11 @@ assert(1.numDigits!2 == 1); assert(2.numDigits!2 == 2); assert(3.numDigits!2 == 2); + + // test bad radices + static assert(!__traits(compiles, 100.numDigits!1())); + static assert(!__traits(compiles, 100.numDigits!0())); + static assert(!__traits(compiles, 100.numDigits!37())); } int dstrcmp( scope const char[] s1, scope const char[] s2 ) @trusted diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/druntime-2.080.0/src/object.d new/druntime-2.080.1/src/object.d --- old/druntime-2.080.0/src/object.d 2018-04-17 11:34:24.000000000 +0200 +++ new/druntime-2.080.1/src/object.d 2018-05-25 04:35:15.000000000 +0200 @@ -137,7 +137,7 @@ } } -auto opEquals(Object lhs, Object rhs) +bool opEquals(Object lhs, Object rhs) { // If aliased to the same object or both null => equal if (lhs is rhs) return true; @@ -162,7 +162,7 @@ /************************ * Returns true if lhs and rhs are equal. */ -auto opEquals(const Object lhs, const Object rhs) +bool opEquals(const Object lhs, const Object rhs) { // A hack for the moment. return opEquals(cast()lhs, cast()rhs); ++++++ phobos-2.080.0.tar.gz -> phobos-2.080.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/bitflags-property-opdispatch.dd new/phobos-2.080.1/changelog/bitflags-property-opdispatch.dd --- old/phobos-2.080.0/changelog/bitflags-property-opdispatch.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/bitflags-property-opdispatch.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,49 +0,0 @@ -`std.typecons.BitFlags` now supports opDispatch-based property access - -$(REF BitFlags, std, typecons) was extended so that enum members can be set and tested directly on the -`BitFlags` instead of having to `&` with the underlying enum. - -------- -enum Features -{ - fast = 1 << 0, - size = 1 << 1, -} - -void run(BitFlags!Features features) -{ - // get - if (features.fast && !features.size) {} // new new new - if ((features & Features.fast) && !(features & Features.size)) {} // old old old - // set - features.fast = true; // new new new - features.fast = false; // new new new - features.fast |= Features.fast; // old old old - features.fast &= ~Features.fast; // old old old -} -------- - -This also works for unsafe `BitFlags` where the property get access tests for an exact -match of all bits of the unsafe `BitFlags` combination. -Analogously, the property set access clears or sets all bits of the unsafe `BitFlags` combination. - -------- -enum Features -{ - fast = 1 << 0, - size = 1 << 1, - combined = fast | size, -} - -void run(BitFlags!(Features, Yes.unsafe) features) -{ - // get - if (features.combined) {} // new new new - if ((features & Features.combined) == BitFlags!(Features, Yes.unsafe)(Features.combined)) {} // old old old - // set - features.combined = true; // new new new - features.combined = false; // new new new - features.combined |= Features.combined; // old old old - features.combined &= ~Features.combined; // old old old -} -------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/rndtonl-deprecated.dd new/phobos-2.080.1/changelog/rndtonl-deprecated.dd --- old/phobos-2.080.0/changelog/rndtonl-deprecated.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/rndtonl-deprecated.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +0,0 @@ -std.math.rndtonl has been deprecated - -$(REF rndtonl, std, math) is a rounding function only available when using the -Digital Mars C Runtime on Windows. As this function is not cross-platform, it -has been deprecated, and will be removed on version 2.089. Please use -$(REF round, std, math) instead. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/shared-bitmapped-block.dd new/phobos-2.080.1/changelog/shared-bitmapped-block.dd --- old/phobos-2.080.0/changelog/shared-bitmapped-block.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/shared-bitmapped-block.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,26 +0,0 @@ -Added the SharedBitmappedBlock, as the thread-safe version of the regular BitmappedBlock. - -The new $(REF SharedBitmappedBlock, std,experimental,allocator,building_blocks,bitmapped_block) and its single-threaded version can now be instantiated with `Yes.multiblock` or `No.multiblock`. -If instantiated with `Yes.multiblock` (the default behavior), each allocation can return an arbitrary number of blocks. -With `No.multiblock` however, any allocation request can't exceed the block size. This allows for greater performance on both single and multithreaded environments. - ---- -// The 'BitmappedBlock' is implicitly instantiated with Yes.multiblock -auto a = BitmappedBlock!(blockSize, 8, Mallocator, Yes.multiblock)(numBlocks * blockSize); - -// Instantiated with Yes.multiblock, can allocate more than one block at a time -void[] buf = a.allocate(2 * blockSize); -assert(buf.length == 2 * blockSize); -assert(a.deallocate(buf)); ---- - ---- -// Instantate the 'BitmappedBlock' with No.multiblock -auto a = BitmappedBlock!(blockSize, 8, Mallocator, No.multiblock)(1024 * blockSize); - -// Since instantiated with No.multiblock, can only allocate at most the block size -void[] buf = a.allocate(blockSize + 1); -assert(buf is null); ---- - -For shared the same rules apply, we only need to replace `BitmappedBlock` with `SharedBitmappedBlock`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/std-aligned-block-list.dd new/phobos-2.080.1/changelog/std-aligned-block-list.dd --- old/phobos-2.080.0/changelog/std-aligned-block-list.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/std-aligned-block-list.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,10 +0,0 @@ -Implemented a new allocator, `AlignedBlockList` and its thread-safe version `SharedAlignedBlockList` - -$(REF AlignedBlockList, std,experimental,allocator,building_blocks, aligned_block_list) represents -a list of allocators which allows for deallocations in constant time. -Although allocations are in theory served in linear searching time, `deallocate` calls take -$(BIGOH 1) time, by using aligned allocations. The `ParentAllocator` must implement `alignedAllocate`. - -$(REF SharedAlignedBlockList, std,experimental,allocator,building_blocks, aligned_block_list) has the -same semantics as its single threaded version, however the internal allocators must be in addition marked -as shared. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/std-exception-enforceEx.dd new/phobos-2.080.1/changelog/std-exception-enforceEx.dd --- old/phobos-2.080.0/changelog/std-exception-enforceEx.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/std-exception-enforceEx.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,24 +0,0 @@ -`std.exception.enforceEx` was deprecated in favor of `std.exception.enforce` - -With 2.079 $(REF enforce, std,exception) became a complete super set of -$(REF enforceEx, std,exception) - -$(H3 Corrective action) - -Replace: - ---- -import std.exception; -alias enf = enforceEx!Exception; -assertNotThrown(enf(true)); -assertThrown(enf(false, "blah")); ---- - -with: - ---- -import std.exception; -alias enf = enforce!Exception; -assertNotThrown(enf(true)); -assertThrown(enf(false, "blah")); ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/std-format-fixDigitGrouping.dd new/phobos-2.080.1/changelog/std-format-fixDigitGrouping.dd --- old/phobos-2.080.0/changelog/std-format-fixDigitGrouping.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/std-format-fixDigitGrouping.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,29 +0,0 @@ -Fixed digits grouping for floating point number without decimal part - -$(REF formatValue, std, format) now correctly groups digits in the output string -by inserting a group separator character (,) every n characters specified -by the $(LINK2 https://dlang.org/library/std/format/formatted_write.html#format-string, Separator) -grammar rule in cases with zero decimal precision specified in the format string -for floating point numbers. - -No group separators at all are inserted for floating point numbers when formatted -with zero precision (i.e. no decimal digits) in Phobos before this fix, -regardless of the respective decimal part of the formatted number. - -------- -import std.format; - -assert(format("%,3.2f", 1172.009) == "1,172.01"); -assert(format("%,3.0f", 1172.009) == "1,172"); -assert(format("%#,3.4f", 1303.2508) == "1,303.250,8"); -assert(format("%#,3.0f", 1303.2508) == "1,303."); - -// original (buggy) behaviour before this fix -//assert(format("%,3.0f", 1303.2508) == "1303"); -//assert(format("%,3.0f", 1303.) == "1303"); - -// original (correct) behaviour before this fix -//assert(format("%,3.1f", 1303.2508) == "1,303.3"); -//assert(format("%,3.2f", 1303.) == "1,303.00"); -//assert(format("%,3f", 1303.) == "1,303.000,000"); -------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/std-functional-binaryReverseArgs.dd new/phobos-2.080.1/changelog/std-functional-binaryReverseArgs.dd --- old/phobos-2.080.0/changelog/std-functional-binaryReverseArgs.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/std-functional-binaryReverseArgs.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,5 +0,0 @@ -`std.functional.binaryReverseArgs` was deprecated in favor of `std.functional.reverseArgs` - -$(REF reverseArgs, std,functional) is a full super set of $(REF binaryReverseArgs, std,functional). - -Correct action: replace `binaryReverseArgs` with `reverseArgs`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/changelog/std-typecons-nullable-apply.dd new/phobos-2.080.1/changelog/std-typecons-nullable-apply.dd --- old/phobos-2.080.0/changelog/std-typecons-nullable-apply.dd 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/changelog/std-typecons-nullable-apply.dd 1970-01-01 01:00:00.000000000 +0100 @@ -1,15 +0,0 @@ -`apply` was added to `std.typecons`. - -`apply` is an operation for $(REF Nullable, std, typecons) values that "unpacks" the `Nullable`, performs some -operation (that is passed as a template parameter), then packs the result into another `Nullable` if necessary. -When the initial `Nullable` is `null`, the resulting `Nullable` is also `null` and the function is not -called. - ------ -Nullable!int n; -alias square = i => i * i; -n = n.apply!square; // does nothing if isNull -assert(n.isNull); -n = 2; -assert(n.apply!square.get == 4); ------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/std/traits.d new/phobos-2.080.1/std/traits.d --- old/phobos-2.080.0/std/traits.d 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/std/traits.d 2018-05-28 23:50:40.000000000 +0200 @@ -8341,6 +8341,17 @@ static assert(res[0].stringof == "a"); } +// #18884: getSymbolsByUDA fails on AliasSeq members +@safe unittest +{ + struct X + { + alias A = AliasSeq!(ulong, uint); + } + + static assert(is(getSymbolsByUDA!(X, X) == AliasSeq!())); +} + // #18624: getSymbolsByUDA produces wrong result if one of the symbols having the UDA is a function @safe unittest { @@ -8374,7 +8385,7 @@ } else { - alias member = Alias!(__traits(getMember, symbol, names[0])); + alias member = AliasSeq!(__traits(getMember, symbol, names[0])); // Filtering not compiled members such as alias of basic types. static if (!__traits(compiles, hasUDA!(member, attribute))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/phobos-2.080.0/std/uni.d new/phobos-2.080.1/std/uni.d --- old/phobos-2.080.0/std/uni.d 2018-04-30 16:38:51.000000000 +0200 +++ new/phobos-2.080.1/std/uni.d 2018-05-28 23:50:40.000000000 +0200 @@ -4086,9 +4086,8 @@ */ void putValue(Key key, Value v) { - import std.conv : text; auto idx = getIndex(key); - enforce(idx >= curIndex, text(errMsg, " ", idx)); + enforce(idx >= curIndex, errMsg); putAt(idx, v); }