Beta 2.095.0

Paolo Invernizzi paolo.invernizzi at gmail.com
Thu Dec 24 21:59:31 UTC 2020


On Thursday, 24 December 2020 at 18:05:30 UTC, Mathias LANG wrote:
> On Thursday, 24 December 2020 at 11:38:11 UTC, Paolo Invernizzi 
> wrote:
>>
>> The point is that the deprecation is coming from an external 
>> library, it would be great to have the precise instantiation 
>> point in that source code, so I was wondering if that dmd 
>> improvement [1] should print a more detailed trace.
>>
>> [1] 
>> https://dlang.org/changelog/2.095.0.html#deprecation-context
>
> It does print a detailed stack trace (up to the first symbol 
> that is not a template) if you don't use `-de`. If you use 
> `-de`, since the checks in Phobos are 
> `is(typeof(n.toString()))` or `__traits(compiles, 
> n.toString())`, then it just changes whether or not the code 
> compiles, and as a result changes the output of the program. A 
> trivial example:
>
> ```
> import std.stdio, std.typecons;
> struct Foo {
>     deprecated string toString() const { return "Oops"; }
> }
> void main () { writefln("%s", Foo.init); }
> ```
>
> Will print, with v2.094.2 or before (dmd -run):
> ```
> /usr/local/opt/dmd/include/dlang/dmd/std/format.d(3921): 
> Deprecation: function foo.Foo.toString is deprecated
> /usr/local/opt/dmd/include/dlang/dmd/std/format.d(4053): 
> Deprecation: function foo.Foo.toString is deprecated
> Oops
> ```
>
> Not great. If you use `dmd -de -run`, you'll get:
> ```
> Foo()
> ```
>
> Notice the deprecations are gone, but so is the usage of the 
> `toString` method. Using DMD v2.095.0-beta.1 with `-de` should 
> give you the same output, but without `-de`:
>
> ```
> % ~/dlang/dmd-2.095.0-beta.1/osx/bin/dmd -run foo.d
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/format.d(3921): Deprecation: function foo.Foo.toString is deprecated
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/format.d(4420):        instantiated from here: hasToString!(Foo, char)
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/format.d(4053): Deprecation: function foo.Foo.toString is deprecated
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/format.d(4430):        instantiated from here: formatObject!(LockingTextWriter, Foo, char)
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/format.d(1875):        instantiated from here: formatValueImpl!(LockingTextWriter, Foo, char)
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/format.d(576):        instantiated from here: formatValue!(LockingTextWriter, Foo, char)
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/stdio.d(1661):        ... (1 instantiations, -v to show) ...
> /Users/geod24/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/stdio.d(4271):        instantiated from here: writefln!(char, Foo)
> foo.d(5):        instantiated from here: writefln!(char, Foo)
> Oops
> ```
>
> So the feature works as intended, however `-de` is a dangerous 
> trap, as it changes what is instantiated.

Thanks Matias,

My point is that the result without -de is
---
/Users/pinver/dlang/dmd-2.095.0-beta.1/osx/bin/dmd  -i -g -debug  
src/foo.d
/Users/pinver/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/traits.d(3727): Deprecation: function std.typecons.Nullable!long.Nullable.get_ is deprecated - Implicit conversion with alias Nullable.get this will be removed after 2.096. Please use .get explicitly.
/Users/pinver/dlang/dmd-2.095.0-beta.1/osx/bin/../../src/phobos/std/traits.d(3727): Deprecation: function std.typecons.Nullable!short.Nullable.get_ is deprecated - Implicit conversion with alias Nullable.get this will be removed after 2.096. Please use .get explicitly.
---

Which unfortunately is pretty useless in my case ...



More information about the Digitalmars-d-announce mailing list