Re: dmd 1.069 and 2.054 release

2011-07-21 Thread Don

Walter Bright wrote:

On 7/20/2011 2:29 PM, Don wrote:

The new CTFE docs got left out somehow.


Not sure what you're referring to?


Sorry, it seems something went wrong with my repository. When I pushed, 
it didn't push to anything...

I'll redo it.


Re: dmd 1.069 and 2.054 release

2011-07-20 Thread Walter Bright

On 7/20/2011 2:29 PM, Don wrote:

The new CTFE docs got left out somehow.


Not sure what you're referring to?


Re: dmd 1.069 and 2.054 release

2011-07-14 Thread #1052; #1080; #1093; #1072; #1080; #1083; #1057; #1090; #1088; #1072; #1096; #1091; #1085;
Is there any reason for linux.mak to still exist there then?
http://www.digitalmars.com/d/2.0/dmd-linux.html#compiling_dmd seems outdated 
then
and I really would like to get it right - maintaining dmd2 in Arch Linux User
Repository is my responsibility ( and I was using linux.mak till now ).


Re: dmd 1.069 and 2.054 release

2011-07-14 Thread Jonathan M Davis
On Thursday 14 July 2011 12:44:29 #1052; #1080; #1093; #1072; #1080; 
#1083; #1057; #1090; #1088; #1072; #1096; #1091; #1085; wrote:
 Is there any reason for linux.mak to still exist there then?
 http://www.digitalmars.com/d/2.0/dmd-linux.html#compiling_dmd seems outdated
 then and I really would like to get it right - maintaining dmd2 in Arch
 Linux User Repository is my responsibility ( and I was using linux.mak till
 now ).

It's not in github. I expect that it's a result of Walter not creating the zip 
file from scratch every time. So, it was cruft that didn't get cleaned out.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-14 Thread bearophile
Walter:

I was forgetting, DMD 2.054 has fulfilled this enhancement request too:
http://d.puremagic.com/issues/show_bug.cgi?id=5250

Bye,
bearophile


Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Jonathan M Davis
On Tuesday 12 July 2011 19:18:10 Leandro Lucarella wrote:
 Jonathan M Davis, el 12 de julio a las 21:51 me escribiste:
  If you want how the language treats deprecated to change, then feel free
  to create a pull request and try and talk Walter into it. Arguably,
  warning about deprecation and then only failing to compile when the
  deprecated stuff is actually removed is the better way to handle
  things. But that's not how D is designed (probably at least in part
  because Walter doesn't really believe in warnings). So, feel free to
  try and talk Walter into it, but unless the default behavior is
  changed, deprecating something is going to silently break people's code
  unless you tell them about it first (which is the point of scheduling
  something for deprecation).
 
 So, your solution is issuing warnings behind the compiler and Walter's
 back. Great! I love this! Now I remember why I loved D so much =P

Nothing is being done behind anyone's back. It was Walter who pushed for stuff 
to be scheduled for deprecation before being actually deprecated, because he 
didn't want code breaking on people without any warning. We decided to use 
pragmas to present messages to the user informing them of the impending 
deprecation, because the language doesn't currently have anything built in 
with the concept of scheduled for deprecation. It was either that or not 
warn about the impending deprecation except in the changelog and 
documentation, in which case, anyone who doesn't pay enough attention to those 
would still end up with their code being broken without warning when the 
symbols are actually deprecated. So, we went for the messages. If the majority 
of people would prefer not to have the messages and risk having their code 
break when something is deprecated, because they missed the notice in the 
changelog or documentation, then the messages will go away. But we thought 
that they were a good idea, so we put them in there. None of this is trying to 
circumvent Walter or the compiler.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Trass3r
It occured for the mixin method to generate the different exception  
classes. Specifically the toCamelCase method was not working there.


Ok.

Do you have any idea how to solve the problem I described in D.learn?  
(template instance cannot use local.)


Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Trass3r
Looks like it fails to build under Linux using linux.mak makefile due to  
missing
intrange.c / intrange.o in file lists. Linking stage errors. When I add  
them

manually, everything works like a charm.


I think compiling it worked just fine for me.


Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Walter Bright

On 7/13/2011 9:58 AM, #1052 wrote:

Looks like it fails to build under Linux using linux.mak makefile due to missing
intrange.c / intrange.o in file lists. Linking stage errors. When I add them
manually, everything works like a charm.
Could this one be fixed?


Use posix.mak for the linux builds now.


Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Andrej Mitrovic
Damn, I am getting some impressive results comparing VC C++ builds and
DMD D builds. I'm using the PortAudio library and a stress-test that
comes with the project. It tries to generate as many sinewaves as
possible until some maximum is reached. The PortAudio C DLL library is
built in release mode, and is then implicitly linked with a C or D
project. Here's the results:

Stops on 500 max sines, or 0.80 max cpu.

C debug:
numSines = 229, CPU load = 0.802464  // cpu max reached

C release:
numSines = 500, CPU load = 0.793717  // max sines reached

D debug:
numSines = 258, CPU load = 0.800412  // cpu max reached

D release:
numSines = 500, CPU load = 0.629622  // max sines reached


Notice how the C version barely made it to 500 sines in release mode
(almost hit 0.80 CPU), but the D version had plenty of free CPU left
(this is all done on a single core).

I've enabled debug symbols and explicitly enabled floating-point
exceptions in debug builds in the realtime-priority callback function,
via:
version (Debug)
{
import std.math;
FloatingPointControl fpc;
fpc.enableExceptions(FloatingPointControl.severeExceptions);
}

and that still beats C's debug build by a small margin. There were 3
function macros which I've converted to auto templates, I think those
got inlined in release mode. I'm using exceptions in the D version
compared to C's use of goto's.

Here's the C version code: http://codepad.org/4ERFVcSS
And the D version: http://codepad.org/a7XL8wNW

D debug switches (I had to use Debug instead of debug due to a
critical bug): -g -version=Debug
D release switches: -release -inline -O -noboundscheck

Anyway if you want to try it yourself (Windows only for now), do:
git clone https://github.com/AndrejMitrovic/DPortAudio

cd and run \portaudio\build.bat
cd and run \samples\build.bat

The C examples are in the PortAudio project and if you want to compare
with those you'll have to build them yourself.


Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Extrawurst
Is this really that much impressive considering the fact that you 
compare results where the most work is done in the linked DLL itself no 
matter what code calls it, whether it is D or C, Debug or Release ??


On 14.07.2011 00:26, Andrej Mitrovic wrote:

Damn, I am getting some impressive results comparing VC C++ builds and
DMD D builds. I'm using the PortAudio library and a stress-test that
comes with the project. It tries to generate as many sinewaves as
possible until some maximum is reached. The PortAudio C DLL library is
built in release mode, and is then implicitly linked with a C or D
project. Here's the results:

Stops on 500 max sines, or 0.80 max cpu.

C debug:
numSines = 229, CPU load = 0.802464  // cpu max reached

C release:
numSines = 500, CPU load = 0.793717  // max sines reached

D debug:
numSines = 258, CPU load = 0.800412  // cpu max reached

D release:
numSines = 500, CPU load = 0.629622  // max sines reached


Notice how the C version barely made it to 500 sines in release mode
(almost hit 0.80 CPU), but the D version had plenty of free CPU left
(this is all done on a single core).

I've enabled debug symbols and explicitly enabled floating-point
exceptions in debug builds in the realtime-priority callback function,
via:
 version (Debug)
 {
 import std.math;
 FloatingPointControl fpc;
 fpc.enableExceptions(FloatingPointControl.severeExceptions);
 }

and that still beats C's debug build by a small margin. There were 3
function macros which I've converted to auto templates, I think those
got inlined in release mode. I'm using exceptions in the D version
compared to C's use of goto's.

Here's the C version code: http://codepad.org/4ERFVcSS
And the D version: http://codepad.org/a7XL8wNW

D debug switches (I had to use Debug instead of debug due to a
critical bug): -g -version=Debug
D release switches: -release -inline -O -noboundscheck

Anyway if you want to try it yourself (Windows only for now), do:
git clone https://github.com/AndrejMitrovic/DPortAudio

cd and run \portaudio\build.bat
cd and run \samples\build.bat

The C examples are in the PortAudio project and if you want to compare
with those you'll have to build them yourself.




Re: dmd 1.069 and 2.054 release

2011-07-13 Thread Andrej Mitrovic
It's a simplistic test, I agree.

The work done in PortAudio is initalization and release of hardware,
and conversion of different sample rates and buffer sizes, and buffer
types, when necessary.

The Pa_GetStreamCpuLoad() call measures how long it takes for
patestCallback() to finish and based on that calculates the CPU usage.


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Trass3r

In general good work!

But again phobos makes a simple std.string function unCTFEable.
Now I have to use an ugly hack to achieve something as simple as toUpper:

mixin( (){char[] tmp = dup; toUpperInPlace(tmp); return tmp;}() );


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Trass3r
Now I have to use an ugly hack to achieve something as simple as  
toUpper:


mixin( (){char[] tmp = dup; toUpperInPlace(tmp); return tmp;}() );


Damn i found that too and wanted to mention it in the dmd-beta list b4  
release. But the workaround is simple. At least this one was fixed:


http://lists.puremagic.com/pipermail/dmd-beta/2011-July/000773.html

Cause that was making cl4d with all its string mixins pretty much  
unbuildable at all.


Yeah I've done some crazy shit in the cl4d code :D
But in the end that was just another workaround cause template mixins  
couldn't mixin constructors.

Good news: this seems to have been fixed.
Bad news: there still is another problem. I asked about it in D.learn.


btw, that problem you reported, where did it occur in cl4d?


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Leandro Lucarella
Jonathan M Davis, el 11 de julio a las 22:21 me escribiste:
 On Tuesday 12 July 2011 01:28:11 Leandro Lucarella wrote:
  Jonathan M Davis, el 11 de julio a las 18:15 me escribiste:
Despite the confusing non-standard descriptions in --help, -w is the
Treat warnings as errors setting, so it *should* stop compilation
- that's the whole point of -w. The proper Turn warnings on
setting is -wi, not -w.
   
   True. But when we're dealing with messages for something which is
   scheduled for deprecation
  
  What's the point of scheduled for deprecation anyway? Things are
  deprecated, or aren't, anything else should be in the documentation. You
  can always use deprecated features using a compiler, so again... what's
  the point of scheduled for deprectation? I can't really understand
  that concept.
 
 The idea is to have 3 stages while deprecating something.
 
 1. Scheduled for Deprecation.
 2. Deprecated.
 3. Removed.
 
 When a symbol has been deprecated, -d is required to compile any code using 
 that symbol. So, deprecation breaks code. You either have to change your code 
 so that it doesn't use the deprecated symbol, or you have to change your 
 build 
 scripts to use -d. In either case, deprecating a symbol without warning is 
 going to cause problems for anyone maintaining code which uses that symbol.

If you don't want your code to break when something is deprecated, you
should *always* compile with -d, so no, you don't have to change the
build system if you always have -d. Maybe all needed is just a -di (as
in -wi), where deprecation are informed but not treated as errors.

Scheduled for deprecation makes no sense, it's a user decision to use
deprecated code or not, and if should be a user decision if he/she wants
a warning about deprecated stuff or not.

-- 
Leandro Lucarella (AKA luca) http://llucax.com.ar/
--
GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145  104C 949E BFB6 5F5A 8D05)
--
No tengo alas, como un planeador.
No tengo luces, como un plato volador.
Perdi mi rumbo soy un auto chocador.


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Jonathan M Davis
On 2011-07-12 10:07, Leandro Lucarella wrote:
 Jonathan M Davis, el 11 de julio a las 22:21 me escribiste:
  On Tuesday 12 July 2011 01:28:11 Leandro Lucarella wrote:
   Jonathan M Davis, el 11 de julio a las 18:15 me escribiste:
 Despite the confusing non-standard descriptions in --help, -w is
 the Treat warnings as errors setting, so it *should* stop
 compilation - that's the whole point of -w. The proper Turn
 warnings on setting is -wi, not -w.

True. But when we're dealing with messages for something which is
scheduled for deprecation
   
   What's the point of scheduled for deprecation anyway? Things are
   deprecated, or aren't, anything else should be in the documentation.
   You can always use deprecated features using a compiler, so again...
   what's the point of scheduled for deprectation? I can't really
   understand that concept.
  
  The idea is to have 3 stages while deprecating something.
  
  1. Scheduled for Deprecation.
  2. Deprecated.
  3. Removed.
  
  When a symbol has been deprecated, -d is required to compile any code
  using that symbol. So, deprecation breaks code. You either have to
  change your code so that it doesn't use the deprecated symbol, or you
  have to change your build scripts to use -d. In either case, deprecating
  a symbol without warning is going to cause problems for anyone
  maintaining code which uses that symbol.
 
 If you don't want your code to break when something is deprecated, you
 should *always* compile with -d, so no, you don't have to change the
 build system if you always have -d. Maybe all needed is just a -di (as
 in -wi), where deprecation are informed but not treated as errors.
 
 Scheduled for deprecation makes no sense, it's a user decision to use
 deprecated code or not, and if should be a user decision if he/she wants
 a warning about deprecated stuff or not.

Except, of course, that good cood generally won't use anything that's 
deprecated, since the deprecated item is going to go away. The user can decide 
to use -d and use deprecated code if it makes sense for them, but that really 
should be decided on a case-by-case basis. Most programmers won't want to use 
-d. So, they're not going to compile with -d by default. So, deprecating 
something will break their code. By saying that you're scheduling something 
for deprecation, you're giving the user time to deal with the change before it 
breaks their code.

Now, I could see an argument for changing how deprecation works so that 
deprecated has no effect unless a flag turns it on, in which case, the user is 
deciding whether they want to warned about using deprecated code. In such a 
case, scheduled for deprecation isn't quite as necessary, but then you're 
just going to break everyone's code when you remove the function (at least 
everyone who didn't use the flag to be warned about using deprecated symbols). 
And rather than being able to then change their build scripts to use -d while 
they fix the problem, they then _have_ to go change their code (or not upgrade 
their libraries) in order for their code to compile. But that's not how 
deprecated works in D.

When a symbol is deprecated, it's an error to use it unless you compile with -
d. So, there is no warning about using deprecated stuff. It's an outright 
error. It just so happens that you can turn it off if you need to (hopefully 
as a quick fix). And given that deprecating a symbol introduces errors into 
the code of anyone who uses that symbol, informing people ahead of time gives 
them the opportunity to change their code before it breaks. The result is a 
much smoother process.

1. Something is scheduled for deprecation, so programmers then have the time 
to figure out what they're going to do to change their code, and they have 
time to make the changes. Nothing breaks. No one is forced to make immediate 
changes.

2. The symbol is then deprecated. Anyone who did not take the time to make 
changes as they were told that they were going to have to do then has broken 
code, but they have the quick fix of compiling with -d if they need to. 
They're still going to have to figure out what they're going to do about 
changing their code, and they're forced to look at the problem at least far 
enough to enable -d, but their code can still work with some changes to their 
build scripts.

3. The symbol is outright removed. Programmers have had ample time to change 
their code, and if they haven't, they now have to. But they were told that the 
symbol was going away and had to have made changes to their build scripts to 
even use it this long, so the developer of the library hasn't just screwed 
them over.

The idea is to provide a smooth path for necessary changes. And just 
deprecating something out of the blue does _not_ do that.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Jonathan M Davis
On 2011-07-12 13:52, Leandro Lucarella wrote:
 Jonathan M Davis, el 12 de julio a las 18:12 me escribiste:
When a symbol has been deprecated, -d is required to compile any code
using that symbol. So, deprecation breaks code. You either have to
change your code so that it doesn't use the deprecated symbol, or you
have to change your build scripts to use -d. In either case,
deprecating a symbol without warning is going to cause problems for
anyone maintaining code which uses that symbol.
   
   If you don't want your code to break when something is deprecated, you
   should *always* compile with -d, so no, you don't have to change the
   build system if you always have -d. Maybe all needed is just a -di (as
   in -wi), where deprecation are informed but not treated as errors.
   
   Scheduled for deprecation makes no sense, it's a user decision to use
   deprecated code or not, and if should be a user decision if he/she
   wants a warning about deprecated stuff or not.
  
  Except, of course, that good cood generally won't use anything that's
  deprecated, since the deprecated item is going to go away. The user can
  decide to use -d and use deprecated code if it makes sense for them, but
  that really should be decided on a case-by-case basis. Most programmers
  won't want to use -d. So, they're not going to compile with -d by
  default. So, deprecating something will break their code. By saying that
  you're scheduling something for deprecation, you're giving the user time
  to deal with the change before it breaks their code.
  
  Now, I could see an argument for changing how deprecation works so that
  deprecated has no effect unless a flag turns it on, in which case, the
  user is deciding whether they want to warned about using deprecated
  code. In such a case, scheduled for deprecation isn't quite as
  necessary, but then you're just going to break everyone's code when you
  remove the function (at least everyone who didn't use the flag to be
  warned about using deprecated symbols). And rather than being able to
  then change their build scripts to use -d while they fix the problem,
  they then _have_ to go change their code (or not upgrade their
  libraries) in order for their code to compile. But that's not how
  deprecated works in D.
 
 So then, why don't we fix it (patch attached, you can apply it with 'git
 am file'). I think -di is the real solution to the problem. Things are
 deprecated or not, and people want to be informed if they are using
 something deprecated or not. Scheduled for deprecation seems to be a way
 to say show me a deprecation message, not a real state.
 
  When a symbol is deprecated, it's an error to use it unless you compile
  with - d. So, there is no warning about using deprecated stuff. It's an
  outright error. It just so happens that you can turn it off if you need
  to (hopefully as a quick fix). And given that deprecating a symbol
  introduces errors into the code of anyone who uses that symbol,
  informing people ahead of time gives them the opportunity to change
  their code before it breaks. The result is a much smoother process.
 
 OK, then we should fix the compiler (again, patch attached). -di is the
 solution. My patch doesn't change the defaults, but if people think is
 better to show deprecation errors by default, it can be trivially
 changed.
 
  1. Something is scheduled for deprecation, so programmers then have the
  time to figure out what they're going to do to change their code, and
  they have time to make the changes. Nothing breaks. No one is forced to
  make immediate changes.
 
 This is what deprecated is for! Removing stuff breaks code, not
 deprecating stuff! Deprecated really is scheduled for removal, so
 scheduled for deprecation is scheduled for scheduled for removal, it
 makes no sense. Fix the compiler!
 
  2. The symbol is then deprecated. Anyone who did not take the time to
  make changes as they were told that they were going to have to do then
  has broken code, but they have the quick fix of compiling with -d if
  they need to. They're still going to have to figure out what they're
  going to do about changing their code, and they're forced to look at the
  problem at least far enough to enable -d, but their code can still work
  with some changes to their build scripts.
  
  3. The symbol is outright removed. Programmers have had ample time to
  change their code, and if they haven't, they now have to. But they were
  told that the symbol was going away and had to have made changes to
  their build scripts to even use it this long, so the developer of the
  library hasn't just screwed them over.
  
  The idea is to provide a smooth path for necessary changes. And just
  deprecating something out of the blue does _not_ do that.
 
 Unless we fix the compiler :)

This doesn't really fix the problem. Deprecating something is still going to 
break code unless people actively try and avoid it by using -di, so 

Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Adam D. Ruppe
Jonathan M Davis wrote:
 Deprecating something is still going to break code

Breaking with deprecated is an entirely different kind of breakage
than removing something.

deprecated means simply please don't use this specific thing. You
can tell it shut up I know better than you and be on your way.

It's in your face enough that you can change it right there and then
if you want to, but it's easy enough to shut it up too.


Here's my preference list for changes:

Top preference: don't change stuff.

Next: use the deprecated attribute

Next: versioned scheduled to be deprecated messages. I don't like
being spammed every time I compile.

Next: scheduled to be deprecated messages as they are now

Last: removing it entirely. (this should be very, very rare
especially if we want to be called stable. Nothing has pissed me
off more with the last few releases than Phobos losing
functionality.)


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Michel Fortin

On 2011-07-12 16:52:10 -0400, Leandro Lucarella l...@llucax.com.ar said:


This is what deprecated is for! Removing stuff breaks code, not
deprecating stuff! Deprecated really is scheduled for removal, so
scheduled for deprecation is scheduled for scheduled for removal, it
makes no sense. Fix the compiler!


Actually it sometime makes sense that you'd schedule something to be 
later scheduled for removal. If there is no replacement for a certain 
feature, making it deprecated is just a nuisance since the compiler 
will complain about the problem but you have no alternative yet.


Now, I think the argument for scheduling things for deprecation is just 
an extreme of that: deprecating things is a nuisance because it breaks 
code, so we'll schedule them to be deprecated later. But then we add a 
warning for those things scheduled for deprecation because we don't 
want people to use them, and scheduled for deprecation has just 
become a synonym for deprecated but not yet breaking your code. 
Fixing deprecated to not break code by default is a better option, I 
think.


--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/



Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Jonathan M Davis
On 2011-07-12 15:09, Adam D. Ruppe wrote:
 Jonathan M Davis wrote:
  Deprecating something is still going to break code
 
 Breaking with deprecated is an entirely different kind of breakage
 than removing something.
 
 deprecated means simply please don't use this specific thing. You
 can tell it shut up I know better than you and be on your way.

 It's in your face enough that you can change it right there and then
 if you want to, but it's easy enough to shut it up too. 

True. But Walter has been pretty insistent that things not be deprecated 
without warning first, because code which compiled perfectly before doesn't 
anymore, even if all you have to do is change your build scripts.

Now, as for the scheduled for deprecation messages, we can stop doing that. 
But then the documentation is going to be the only thing warning anyone, and 
then code is going to get broken when stuff is actually deprecated. Given the 
fact that you can use -d, that's not the end of the world. But it does mean 
that deprecation is going to tend to come out of nowhere for most people, and 
Walter has been very adamant about avoiding suddenly breaking people's code - 
even by requiring them to add -d to their build scripts.

So, if most people don't want the messages, then the messages will go away. 
But that means that people actually need to pay attention to the changelog and 
documentation.

 Here's my preference list for changes:
 
 Top preference: don't change stuff.
 
 Next: use the deprecated attribute
 
 Next: versioned scheduled to be deprecated messages. I don't like
 being spammed every time I compile.
 
 Next: scheduled to be deprecated messages as they are now
 
 Last: removing it entirely. (this should be very, very rare
 especially if we want to be called stable. Nothing has pissed me
 off more with the last few releases than Phobos losing
 functionality.)

The current plan is that _everything_ which gets deprecated will be removed. 
Stuff which is deprecated is not intended to stick around. Now, it should be 
pretty rare that deprecated stuff doesn't have a replacement. Outright 
removing functionality should be very rare indeed. It may happen in a few 
cases where the functionality just isn't generally useful, but overall, it 
should be rare.

Deprecation is likely to fall primarily in 3 categories at this point:

1. Renaming stuff to follow Phobos' naming conventions. A lot of this was 
fixed with 2.054, but there's still some left to do. For the most part though, 
this should be a set of fixes which will be done fairly soon and then we won't 
have to make those kind of changes again.

2. Small redesigns of older functionality. The prime case that I can think of 
is that there has been talk of replacing the use of patterns in std.string 
with uses of std.regex.Regex.

3. Full module redesigns due to the need of serious improvement. std.datetime 
replacing std.date would be a prime example of this, but there are a few other 
modules which are supposed to be redesigned (e.g. std.xml and std.stream).

The idea at least is that these sort of changes should be taking place fairly 
soon and that we then won't need to do any of that kind of thing anymore (or 
at least only very rarely). The review process should catch most of these sort 
of issues before they actually get into Phobos in the first place. But some 
code has not aged well as D and Phobos have changed, and Phobos has not always 
been consistent in naming, and that needs to be fixed sooner rather than 
later.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Adam D. Ruppe
Jonathan M Davis wrote:
 The current plan is that _everything_ which gets deprecated will
 be removed.

What's the reason for removing things? Surely it's not disk space!


Anyway, let's look at the three categories. While I hate change,
there are two kinds of change: trivial and painful. Remember, D
isn't a useless piece of junk dynamic language - trivial changes
are easy to find and easy to change with confidence.

Painful changes though, are, well, painful.


 1. Renaming stuff to follow Phobos' naming conventions.

These are trivial, just change it. It's like ripping off a band-aid.
The compiler will tell you what broke and how to fix it (the spell
checker ought to catch camelcase changes without keeping the old
name).

Do it fast, feel the brief pain, and move on.


 2. Small redesigns of older functionality.

These should be reasonably trivial fixes too, but might warrant
deprecating the old on a case by case basis. If it's mindless
to change though, just rip that bandage off.

Just make sure that the types are different or something, while
still super easy to change, so the compiler will point it out to you.


 3. Full module redesigns due to the need of serious improvement

This is where the pain comes in, since instead of spending 15
minutes running a mindless find/replace when the compiler tells
you to, it requires gutting a lot of code and rethinking it,
converting databases, etc.

These should ideally aim to redesign the internals, but keep the
same interface. Maybe adding to it or writing the old as an
emulation layer over the new.

This is preferred, since then new and old exist together. It avoids
actually breaking anybody's code.


If that's impossible though, this is the most likely candidate
for deprecation. Unlike a name change, it isn't easy to change,
so a compile error is more likely to mean reverting dmd versions
than actually changing it.


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Walter Bright

On 7/11/2011 8:31 AM, Andrej Mitrovic wrote:

Walter, could you please add these to the changelog:


Done.


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Andrej Mitrovic
Thanks!


Re: dmd 1.069 and 2.054 release

2011-07-12 Thread Jonathan M Davis
On Tuesday 12 July 2011 23:38:10 Adam D. Ruppe wrote:
 Jonathan M Davis wrote:
  The current plan is that _everything_ which gets deprecated will
  be removed.
 
 What's the reason for removing things? Surely it's not disk space!
 
 
 Anyway, let's look at the three categories. While I hate change,
 there are two kinds of change: trivial and painful. Remember, D
 isn't a useless piece of junk dynamic language - trivial changes
 are easy to find and easy to change with confidence.
 
 Painful changes though, are, well, painful.
 
  1. Renaming stuff to follow Phobos' naming conventions.
 
 These are trivial, just change it. It's like ripping off a band-aid.
 The compiler will tell you what broke and how to fix it (the spell
 checker ought to catch camelcase changes without keeping the old
 name).
 
 Do it fast, feel the brief pain, and move on.

Hmm. I don't think that Walter would be very happy about that, since it does 
immediately break code, but as long as the name change is easily found by the 
spellchecker, it wouldn't be a big deal to fix. So, under at least some 
circumstances, that may be acceptable. Regardless, it could be grounds for 
making the deprecation cycle for renaming relatively short instead of around 1 
year as is the current plan for deprecation in general.

  2. Small redesigns of older functionality.
 
 These should be reasonably trivial fixes too, but might warrant
 deprecating the old on a case by case basis. If it's mindless
 to change though, just rip that bandage off.
 
 Just make sure that the types are different or something, while
 still super easy to change, so the compiler will point it out to you.
 
  3. Full module redesigns due to the need of serious improvement
 
 This is where the pain comes in, since instead of spending 15
 minutes running a mindless find/replace when the compiler tells
 you to, it requires gutting a lot of code and rethinking it,
 converting databases, etc.
 
 These should ideally aim to redesign the internals, but keep the
 same interface. Maybe adding to it or writing the old as an
 emulation layer over the new.
 
 This is preferred, since then new and old exist together. It avoids
 actually breaking anybody's code.
 
 
 If that's impossible though, this is the most likely candidate
 for deprecation. Unlike a name change, it isn't easy to change,
 so a compile error is more likely to mean reverting dmd versions
 than actually changing it.

At this point, I expect that the module rewrites are going to generally be 
full-on, completely incompatible rewrites. Fixing the API is one of the major 
reasons for the rewrites (particularly when converting a module  to being 
range-based as is going to occur with std.stream), so just changing the 
implementation isn't going to cut it. It may be that in some cases, it's 
essentially a rewrite of a broken implementation, but I'm not aware of any 
such case at the moment. These are definitely cases, however, where the full 
deprecation cycle is going to be used, so there should be plenty of time to fix 
code. Hopefully, these changes get done fairly soon, but some of them don't 
seem to be going anywhere yet in spite of major discussions about them (e.g. 
std.stream). They're also the most work to do, so while I would expect most of 
the #1 and #2 types of deprecations to occur fairly soon for the most part, 
the full module rewrites could take a while, which is unfortunate.

Off the top of my head, I know that std.xml, std.stream, std.path, and std.json 
are going to get rewrites on some level, and std.container could get some 
major rewrites depending on what Andrei does with memory management in it, 
though what it needs primarily is new containers. Also, Andrei thinks that 
std.encoding is a failed experiment which needs to be redone, so that's 
probably going to need to be rewritten at some point. And as I understand it, 
all of those except for std.stream and std.encoding have someone actively 
working on them (though maybe Andrei has been working on std.stream too; I 
don't know). So, hopefully it won't be too much longer before they're done, 
but it could also be a while unfortunately.

So, anyway, there are some module rewrites to be done, and they're likely to 
be pretty major for better or worse. But once those are done, with the review 
process vetting new modules, deprecation issues like these should be far 
rarer, and Phobos should be heading towards stability.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On Monday 11 July 2011 01:11:09 Jonathan M Davis wrote:
 On Monday 11 July 2011 10:01:26 Jacob Carlborg wrote:
  On 2011-07-11 05:07, Walter Bright wrote:
   Continuing the trend, more people contributed to this release than
   any
   other!
   
   http://www.digitalmars.com/d/1.0/changelog.html
   http://ftp.digitalmars.com/dmd.1.069.zip
   
   http://www.digitalmars.com/d/2.0/changelog.html
   http://ftp.digitalmars.com/dmd.2.054.zip
  
  That was no short list, impressive.
 
 It definitely is impressive. Probably the longest list ever. I would point
 out however, that this line shouldn't be in the changelog:
 
 * Add warning about calling pure nothrow functions and ignoring the result
 
 That change was reverted after it was discovered that it caused too many
 problems.

Oh, and this line should be removed too:

* Added inference for purity and safety

It's basically listed twice, since there's also this line (which is more 
accurate):

* Automatic inference for @safe, pure, nothrow

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Stephan

On 11.07.2011 05:07, Walter Bright wrote:

Continuing the trend, more people contributed to this release than any
other!

http://www.digitalmars.com/d/1.0/changelog.html
http://ftp.digitalmars.com/dmd.1.069.zip

http://www.digitalmars.com/d/2.0/changelog.html
http://ftp.digitalmars.com/dmd.2.054.zip


Nice release list.


Added std.array.uninitializedArray and std.array.minimallyInitializedArray

The online documentation of std.array doesn't seem to be updated. The 
above isn't present there.




Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On Monday 11 July 2011 11:00:15 Stephan wrote:
 On 11.07.2011 05:07, Walter Bright wrote:
  Continuing the trend, more people contributed to this release than any
  other!
  
  http://www.digitalmars.com/d/1.0/changelog.html
  http://ftp.digitalmars.com/dmd.1.069.zip
  
  http://www.digitalmars.com/d/2.0/changelog.html
  http://ftp.digitalmars.com/dmd.2.054.zip
 
 Nice release list.
 
 
 Added std.array.uninitializedArray and std.array.minimallyInitializedArray
 
 The online documentation of std.array doesn't seem to be updated. The
 above isn't present there.

Give it some time. A new release and the updating of the online documentation 
aren't automatically linked. Walter is the one putting up the new release, I 
believe that Andrei is the one who has to update the site. Walter put up the 
release about 6 hours ago. There's a decent chance that Andrei isn't even 
aware that the release has been done yet. The site will be probably be updated 
within the next 24 hours. But regardless, the fact remains that the site 
update and the release itself aren't done by the same person, so the site 
update is likely to be somewhat delayed. The docs in the zip file should be 
properly up-to-date.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Stephan

On 11.07.2011 05:07, Walter Bright wrote:

Continuing the trend, more people contributed to this release than any
other!

http://www.digitalmars.com/d/1.0/changelog.html
http://ftp.digitalmars.com/dmd.1.069.zip

http://www.digitalmars.com/d/2.0/changelog.html
http://ftp.digitalmars.com/dmd.2.054.zip


I like this one:
Added -property switch

But since phobos does not even build with it (in win32) it is pretty 
much useless:


phobos\std\file.d(228): Error: not a property GetLastError:

version(Windows) this(in char[] name,
  uint errno = GetLastError,
  string file = __FILE__,
  size_t line = __LINE__){...}


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Walter Bright

On 7/11/2011 2:21 AM, Stephan wrote:

But since phobos does not even build with it (in win32) it is pretty much 
useless:


Right, that's why it was not made the default. It is there for people to 
experiment with.


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Michel Fortin

On 2011-07-11 05:49:14 -0400, Walter Bright newshou...@digitalmars.com said:


On 7/11/2011 2:21 AM, Stephan wrote:
But since phobos does not even build with it (in win32) it is pretty 
much useless:


Right, that's why it was not made the default. It is there for people 
to experiment with.


And also so that we can work on that problem. My work in progress:

Phobos:
https://github.com/michelf/phobos/compare/master...%40property

Druntime:
https://github.com/michelf/druntime/compare/master...%40property

--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/



Re: dmd 1.069 and 2.054 release

2011-07-11 Thread bearophile
Michel Fortin

 And also so that we can work on that problem. My work in progress:

Very good.

Bye,
bearophile


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Adam D. Ruppe
Jonathan M Davis wrote:
 The deprecation messages are pragmas. They _can't_ give a useful
 line number.

My solution is to replace the pragma with a static assert(0) so
the compiler gives an error and call trace.

/home/me/d/dmd2/linux/bin32/../../src/phobos/std/string.d(885): Error: static
assert  (0) is false
arsd/web.d(575):instantiated from here: tolower!(string)
[snip]


static assert(0) is actually my go-to replacement when things
start to go belly up, especially with templates. The list of
instantiated from here lines is a huge help when figuring it
all out.


Anyway, the pragma is meant to be informative and the assert is
an error. But, there's an easy fix for that too.

In std.string there's a softDeprec template. I think this is new
and it's private to std.string, but it's great because we can
add:

version(scheduled_for_deprecation_is_an_error)
static assert(0);

Thus:
===
private template softDeprec(string vers, string date, string oldFunc, string 
newFunc)
{
version(scheduled_for_deprecation_is_an_error)
static assert(0);
enum softDeprec = Format!(Warning: As of Phobos %s, std.string.%s has been
scheduled  ~
===


And then you get a full error with details upon request.


(btw I keep putting fix and such in quotes because this is a filthy
hack!)


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread dsimcha
== Quote from Walter Bright (newshou...@digitalmars.com)'s article
 Continuing the trend, more people contributed to this release than any other!
 http://www.digitalmars.com/d/1.0/changelog.html
 http://ftp.digitalmars.com/dmd.1.069.zip
 http://www.digitalmars.com/d/2.0/changelog.html
 http://ftp.digitalmars.com/dmd.2.054.zip

Great release!  I noticed that auto ref function parameters are now implemented,
but only for template functions.  Is there a reason for this limitation?  
Example:

Works:

void foo()(auto ref int num) {
num++;
}

Doesn't:

void foo(auto ref int num) {
num++;
}


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Andrei Alexandrescu

On 7/11/11 4:11 AM, Jonathan M Davis wrote:

On Monday 11 July 2011 11:00:15 Stephan wrote:

On 11.07.2011 05:07, Walter Bright wrote:

Continuing the trend, more people contributed to this release than any
other!

http://www.digitalmars.com/d/1.0/changelog.html
http://ftp.digitalmars.com/dmd.1.069.zip

http://www.digitalmars.com/d/2.0/changelog.html
http://ftp.digitalmars.com/dmd.2.054.zip


Nice release list.


Added std.array.uninitializedArray and std.array.minimallyInitializedArray

The online documentation of std.array doesn't seem to be updated. The
above isn't present there.


Give it some time. A new release and the updating of the online documentation
aren't automatically linked. Walter is the one putting up the new release, I
believe that Andrei is the one who has to update the site. Walter put up the
release about 6 hours ago. There's a decent chance that Andrei isn't even
aware that the release has been done yet. The site will be probably be updated
within the next 24 hours. But regardless, the fact remains that the site
update and the release itself aren't done by the same person, so the site
update is likely to be somewhat delayed. The docs in the zip file should be
properly up-to-date.

- Jonathan M Davis


I tried to rebuild the site, the 2.054 tag is not yet present in phobos.

Andrei


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Andrej Mitrovic
Walter, could you please add these to the changelog:

http://d.puremagic.com/issues/show_bug.cgi?id=6026
http://d.puremagic.com/issues/show_bug.cgi?id=5869
http://d.puremagic.com/issues/show_bug.cgi?id=5836
http://d.puremagic.com/issues/show_bug.cgi?id=5598
http://d.puremagic.com/issues/show_bug.cgi?id=5458
http://d.puremagic.com/issues/show_bug.cgi?id=5059
http://d.puremagic.com/issues/show_bug.cgi?id=6101

These were all fixed since 2.043, but I didn't touch the changelog so
they were left out.

Great work everybody on this release!


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Andrej Mitrovic
Also this is a worksforme fix, not a library fix and it doesn't belong
in the changelog:

Bugzilla 3564: Rdmd failing to link external C libraries

Unless someone changed how rdmd does its argument passing.


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On Monday 11 July 2011 13:16:59 Adam D. Ruppe wrote:
 Jonathan M Davis wrote:
  The deprecation messages are pragmas. They _can't_ give a useful
  line number.
 
 My solution is to replace the pragma with a static assert(0) so
 the compiler gives an error and call trace.
 
 /home/me/d/dmd2/linux/bin32/../../src/phobos/std/string.d(885): Error:
 static assert  (0) is false
 arsd/web.d(575):instantiated from here: tolower!(string)
 [snip]
 
 
 static assert(0) is actually my go-to replacement when things
 start to go belly up, especially with templates. The list of
 instantiated from here lines is a huge help when figuring it
 all out.
 
 
 Anyway, the pragma is meant to be informative and the assert is
 an error. But, there's an easy fix for that too.
 
 In std.string there's a softDeprec template. I think this is new
 and it's private to std.string, but it's great because we can
 add:
 
   version(scheduled_for_deprecation_is_an_error)
   static assert(0);
 
 Thus:
 ===
 private template softDeprec(string vers, string date, string oldFunc, string
 newFunc) {
   version(scheduled_for_deprecation_is_an_error)
   static assert(0);
 enum softDeprec = Format!(Warning: As of Phobos %s, std.string.%s has
 been scheduled  ~
 ===
 
 
 And then you get a full error with details upon request.
 
 
 (btw I keep putting fix and such in quotes because this is a filthy
 hack!)

I created softDeprec to make it easier to make the pragma messages (and to 
ensure that they're consistent). I believe that both std.string and std.file 
have one, and the idea is that once they're no longer needed, they'll go away.

The version idea is an interesting one, but I'm not sure if it helps much. The 
error message would give the file and line number of the pragma, not where the 
function was used. And what you really need to know is where the function was 
used so that you can track it down and replace it. If it gives you  stack 
trace though, I guess that it would help, though it would certainly be ugly. 
Fortunately, in the case of something like tolower, _every_ function called 
tolower is scheduled for deprecation (unless you created one in your own 
code), so simply searching for it in your code will locate the ones that need 
to be replaced, but still, the current situation is less than ideal.

What we really need is something like what I was discussing with Daniel - an 
improvement to the deprecated attribute so that it can be used in this kind of 
situation. Then it can become an actual compiler warning, though it wouldn't 
exactly be a normal one, since a function which has only been scheduled for 
deprecation should never cause the compilation to fail because it's used.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread dsimcha
== Quote from Walter Bright (newshou...@digitalmars.com)'s article
 On 7/11/2011 7:04 AM, dsimcha wrote:
  Great release!  I noticed that auto ref function parameters are now 
  implemented,
  but only for template functions.  Is there a reason for this limitation?  
  Example:
 
  Works:
 
  void foo()(auto ref int num) {
   num++;
  }
 
  Doesn't:
 
  void foo(auto ref int num) {
   num++;
  }
 auto ref changes the code generated for the function body, so it must be a 
 template.

So are there multiple instantiations depending on rvalue vs. not rvalue?


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Walter Bright

On 7/11/2011 10:02 AM, dsimcha wrote:

So are there multiple instantiations depending on rvalue vs. not rvalue?


Yes, it has to be that way. It's the difference between passing T* and T.


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On 2011-07-11 09:34, Nick Sabalausky wrote:
 Jonathan M Davis jmdavisp...@gmx.com wrote in message
 news:mailman.1522.1310360091.14074.digitalmars-d-annou...@puremagic.com...
 
  On Monday 11 July 2011 14:26:32 Daniel Murphy wrote:
  Would the following cover all the common use cases? (Phobos seems to be
  the
  biggest user of deprecated so far)
  
  deprecated(message) int a;
  deprecated(message, warn) int b;
  
  With deprecated(warn) messages only being displayed with warnings
  enabled.
  
  No. That's not quite right. If something is actually deprecated, -d is
  required to compile using it. Being able to have a message with it - e.g.
  deprecated(message) - would be very useful, because it could tell you
  what
  you're supposed to use instead (or that nothing is replacing it if that's
  the
  case). Error vs warning has nothing to do with it. Now, it could be that
  compiling with -w would result in the message being printed even if you
  compiled with -d, but that's debatable.
  
  In the case of something which is scheduled for deprecation, the code
  should
  compile regardless. A message would print if that symbol were used, but
  beyond
  that, nothing happens. That _could_ be made so that it only prints when
  you
  compile with -w, and if it's classified as a warning, then that would
  make sense, except that it shouldn't stop compilation even if compiling
  with -w, so
  it can't really follow what warnings normally do with -w. So, how it
  should
  function with regards to -w is debatable.
 
 Despite the confusing non-standard descriptions in --help, -w is the Treat
 warnings as errors setting, so it *should* stop compilation - that's the
 whole point of -w. The proper Turn warnings on setting is -wi, not -w.

True. But when we're dealing with messages for something which is scheduled 
for deprecation, they're _not_ warnings. They're messages. They should never 
cause compilation to fail. What the best way to handle when they print or not 
is debatable, but they should never cause compilation to fail. So, even if 
they were printed because -w was used, they still shouldn't be errors. 
Personally, I'd probably just have them always print (and possibly include a 
separate flag for turning them off), but even if -w were used for enabling 
them, they shouldn't be errors. They're just messages. It's stuff that's 
actually deprecated that affects compilation.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread dsimcha
== Quote from Walter Bright (newshou...@digitalmars.com)'s article
 On 7/11/2011 10:02 AM, dsimcha wrote:
  So are there multiple instantiations depending on rvalue vs. not rvalue?
 Yes, it has to be that way. It's the difference between passing T* and T.

Couldn't you just make the calling convention for auto ref functions be to 
always
pass a T* and create a hidden temporary at the call site if passing an rvalue?


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Walter Bright

On 7/11/2011 12:16 PM, dsimcha wrote:

Couldn't you just make the calling convention for auto ref functions be to 
always
pass a T* and create a hidden temporary at the call site if passing an rvalue?


That can produce a lot of hidden overhead, pretty much wrecking the advantages 
of pass by value.


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Nick Sabalausky
Jonathan M Davis jmdavisp...@gmx.com wrote in message 
news:mailman.1536.1310408114.14074.digitalmars-d-annou...@puremagic.com...
 On 2011-07-11 09:34, Nick Sabalausky wrote:
 Jonathan M Davis jmdavisp...@gmx.com wrote in message
 news:mailman.1522.1310360091.14074.digitalmars-d-annou...@puremagic.com...

  On Monday 11 July 2011 14:26:32 Daniel Murphy wrote:
  Would the following cover all the common use cases? (Phobos seems to 
  be
  the
  biggest user of deprecated so far)
 
  deprecated(message) int a;
  deprecated(message, warn) int b;
 
  With deprecated(warn) messages only being displayed with warnings
  enabled.
 
  No. That's not quite right. If something is actually deprecated, -d is
  required to compile using it. Being able to have a message with it - 
  e.g.
  deprecated(message) - would be very useful, because it could tell you
  what
  you're supposed to use instead (or that nothing is replacing it if 
  that's
  the
  case). Error vs warning has nothing to do with it. Now, it could be 
  that
  compiling with -w would result in the message being printed even if you
  compiled with -d, but that's debatable.
 
  In the case of something which is scheduled for deprecation, the code
  should
  compile regardless. A message would print if that symbol were used, but
  beyond
  that, nothing happens. That _could_ be made so that it only prints when
  you
  compile with -w, and if it's classified as a warning, then that would
  make sense, except that it shouldn't stop compilation even if compiling
  with -w, so
  it can't really follow what warnings normally do with -w. So, how it
  should
  function with regards to -w is debatable.

 Despite the confusing non-standard descriptions in --help, -w is the 
 Treat
 warnings as errors setting, so it *should* stop compilation - that's the
 whole point of -w. The proper Turn warnings on setting is -wi, not -w.

 True. But when we're dealing with messages for something which is 
 scheduled
 for deprecation, they're _not_ warnings. They're messages. They should 
 never
 cause compilation to fail. What the best way to handle when they print or 
 not
 is debatable, but they should never cause compilation to fail. So, even if
 they were printed because -w was used, they still shouldn't be errors.
 Personally, I'd probably just have them always print (and possibly include 
 a
 separate flag for turning them off), but even if -w were used for enabling
 them, they shouldn't be errors. They're just messages. It's stuff that's
 actually deprecated that affects compilation.


Not that I feel strongly about it, but just like scheduled for 
deprication, actual warnings are things that *are* valid code, too. Ie, 
they're just messages, too. The whole point of a warnings as errors 
setting is that some people want that extra help to ensure their code is 
perfectly pristine. (Although, personally, I've never seen particularly 
strong reason for warnings as errors settings anyway.)

To be clear, if we did have some deprecated(scheduled) feature and it was 
non-fatal even with -w, I wouldn't personally have a huge problem with it (I 
never use -w anyway, just -wi). I just don't think it's so clear-cut that 
scheduled for deprication doesn't essentially amount to a warning.




Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On 2011-07-11 13:09, Nick Sabalausky wrote:
 Jonathan M Davis jmdavisp...@gmx.com wrote in message
 news:mailman.1536.1310408114.14074.digitalmars-d-annou...@puremagic.com...
 
  On 2011-07-11 09:34, Nick Sabalausky wrote:
  Jonathan M Davis jmdavisp...@gmx.com wrote in message
  news:mailman.1522.1310360091.14074.digitalmars-d-annou...@puremagic.com.
  ..
  
   On Monday 11 July 2011 14:26:32 Daniel Murphy wrote:
   Would the following cover all the common use cases? (Phobos seems to
   be
   the
   biggest user of deprecated so far)
   
   deprecated(message) int a;
   deprecated(message, warn) int b;
   
   With deprecated(warn) messages only being displayed with warnings
   enabled.
   
   No. That's not quite right. If something is actually deprecated, -d is
   required to compile using it. Being able to have a message with it -
   e.g.
   deprecated(message) - would be very useful, because it could tell
   you what
   you're supposed to use instead (or that nothing is replacing it if
   that's
   the
   case). Error vs warning has nothing to do with it. Now, it could be
   that
   compiling with -w would result in the message being printed even if
   you compiled with -d, but that's debatable.
   
   In the case of something which is scheduled for deprecation, the code
   should
   compile regardless. A message would print if that symbol were used,
   but beyond
   that, nothing happens. That _could_ be made so that it only prints
   when you
   compile with -w, and if it's classified as a warning, then that would
   make sense, except that it shouldn't stop compilation even if
   compiling with -w, so
   it can't really follow what warnings normally do with -w. So, how it
   should
   function with regards to -w is debatable.
  
  Despite the confusing non-standard descriptions in --help, -w is the
  Treat
  warnings as errors setting, so it *should* stop compilation - that's
  the whole point of -w. The proper Turn warnings on setting is -wi,
  not -w.
  
  True. But when we're dealing with messages for something which is
  scheduled
  for deprecation, they're _not_ warnings. They're messages. They should
  never
  cause compilation to fail. What the best way to handle when they print or
  not
  is debatable, but they should never cause compilation to fail. So, even
  if they were printed because -w was used, they still shouldn't be
  errors. Personally, I'd probably just have them always print (and
  possibly include a
  separate flag for turning them off), but even if -w were used for
  enabling them, they shouldn't be errors. They're just messages. It's
  stuff that's actually deprecated that affects compilation.
 
 Not that I feel strongly about it, but just like scheduled for
 deprication, actual warnings are things that *are* valid code, too. Ie,
 they're just messages, too. The whole point of a warnings as errors
 setting is that some people want that extra help to ensure their code is
 perfectly pristine. (Although, personally, I've never seen particularly
 strong reason for warnings as errors settings anyway.)
 
 To be clear, if we did have some deprecated(scheduled) feature and it was
 non-fatal even with -w, I wouldn't personally have a huge problem with it
 (I never use -w anyway, just -wi). I just don't think it's so clear-cut
 that scheduled for deprication doesn't essentially amount to a warning.

Hmm. The main problem with making the scheduled for deprecation messages being 
treated as errors with -w is that if you build with -w (as a lot of people 
do), it breaks your code. And the point of the message is to warn you that 
your code is _going_ to break and to _avoid_ causing immediate breakage.

So, I don't know what the best way to handle to scheduled for deprecation 
messages is, but they really shouldn't cause code to not compile or force you 
to use a specific flag to make your code compile. Otherwise, we might as well 
just fully deprecate them from the get-go.

The simplest way is to just always print the messages until you fix your code, 
but that could be annoying. So, I don't know. But scheduled for deprecation 
messages must not break code.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Nick Sabalausky
Jonathan M Davis jmdavisp...@gmx.com wrote in message 
news:mailman.1539.1310416341.14074.digitalmars-d-annou...@puremagic.com...
 On 2011-07-11 13:09, Nick Sabalausky wrote:

 Not that I feel strongly about it, but just like scheduled for
 deprication, actual warnings are things that *are* valid code, too. Ie,
 they're just messages, too. The whole point of a warnings as errors
 setting is that some people want that extra help to ensure their code is
 perfectly pristine. (Although, personally, I've never seen particularly
 strong reason for warnings as errors settings anyway.)

 To be clear, if we did have some deprecated(scheduled) feature and it 
 was
 non-fatal even with -w, I wouldn't personally have a huge problem with it
 (I never use -w anyway, just -wi). I just don't think it's so clear-cut
 that scheduled for deprication doesn't essentially amount to a warning.

 Hmm. The main problem with making the scheduled for deprecation messages 
 being
 treated as errors with -w is that if you build with -w (as a lot of people
 do), it breaks your code. And the point of the message is to warn you that
 your code is _going_ to break and to _avoid_ causing immediate breakage.


If someone doesn't want warning conditions to break their code, they should 
be using -wi, not -w.





Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On 2011-07-11 13:50, Nick Sabalausky wrote:
 Jonathan M Davis jmdavisp...@gmx.com wrote in message
 news:mailman.1539.1310416341.14074.digitalmars-d-annou...@puremagic.com...
 
  On 2011-07-11 13:09, Nick Sabalausky wrote:
  Not that I feel strongly about it, but just like scheduled for
  deprication, actual warnings are things that *are* valid code, too. Ie,
  they're just messages, too. The whole point of a warnings as errors
  setting is that some people want that extra help to ensure their code is
  perfectly pristine. (Although, personally, I've never seen particularly
  strong reason for warnings as errors settings anyway.)
  
  To be clear, if we did have some deprecated(scheduled) feature and it
  was
  non-fatal even with -w, I wouldn't personally have a huge problem with
  it (I never use -w anyway, just -wi). I just don't think it's so
  clear-cut that scheduled for deprication doesn't essentially amount
  to a warning.
  
  Hmm. The main problem with making the scheduled for deprecation messages
  being
  treated as errors with -w is that if you build with -w (as a lot of
  people do), it breaks your code. And the point of the message is to warn
  you that your code is _going_ to break and to _avoid_ causing immediate
  breakage.
 
 If someone doesn't want warning conditions to break their code, they should
 be using -wi, not -w.

Yes. But the problem is that the scheduled for deprecation messages are not 
supposed to _ever_ break code. And since warnings aren't normally added very 
often, compiling with -w shouldn't cause your code to suddenly break. Granted, 
dmd is still unstable enough that such changes do occur, but once it's fully 
stable, it wouldn't happen very often. But anyone can schedule something for 
deprecation in any library, and the whole point of _scheduling_ the 
deprecation instead of just deprecating it is to avoid breaking code. So, it's 
unacceptable for scheduling something for deprecation to be an error with -w. 
It's informational only. Warnings are _not_ only informational. They're 
telling you that there's actually something wrong with your code. It's just 
not wrong enough to be against the language spec and therefore always be an 
error. Scheduling something for deprecation is indicating that the symbol in 
question will be deprecated in the future and that you should change it before 
that happens. Your code is still fine, and it should still compile.

Bottom line. Marking something as scheduled for deprecation should _never_ 
break code no matter what flags you use to compile your code. Otherwise, 
there's no point to it, and we'd just be deprecating stuff immediately.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Andrew Wiley
On Mon, Jul 11, 2011 at 2:10 PM, Jonathan M Davis jmdavisp...@gmx.comwrote:

 On 2011-07-11 13:50, Nick Sabalausky wrote:
  Jonathan M Davis jmdavisp...@gmx.com wrote in message
  news:mailman.1539.1310416341.14074.digitalmars-d-annou...@puremagic.com.
 ..
 
   On 2011-07-11 13:09, Nick Sabalausky wrote:
   Not that I feel strongly about it, but just like scheduled for
   deprication, actual warnings are things that *are* valid code, too.
 Ie,
   they're just messages, too. The whole point of a warnings as errors
   setting is that some people want that extra help to ensure their code
 is
   perfectly pristine. (Although, personally, I've never seen
 particularly
   strong reason for warnings as errors settings anyway.)
  
   To be clear, if we did have some deprecated(scheduled) feature and
 it
   was
   non-fatal even with -w, I wouldn't personally have a huge problem with
   it (I never use -w anyway, just -wi). I just don't think it's so
   clear-cut that scheduled for deprication doesn't essentially amount
   to a warning.
  
   Hmm. The main problem with making the scheduled for deprecation
 messages
   being
   treated as errors with -w is that if you build with -w (as a lot of
   people do), it breaks your code. And the point of the message is to
 warn
   you that your code is _going_ to break and to _avoid_ causing immediate
   breakage.
 
  If someone doesn't want warning conditions to break their code, they
 should
  be using -wi, not -w.

 Yes. But the problem is that the scheduled for deprecation messages are
 not
 supposed to _ever_ break code. And since warnings aren't normally added
 very
 often, compiling with -w shouldn't cause your code to suddenly break.
 Granted,
 dmd is still unstable enough that such changes do occur, but once it's
 fully
 stable, it wouldn't happen very often. But anyone can schedule something
 for
 deprecation in any library, and the whole point of _scheduling_ the
 deprecation instead of just deprecating it is to avoid breaking code. So,
 it's
 unacceptable for scheduling something for deprecation to be an error with
 -w.
 It's informational only. Warnings are _not_ only informational. They're
 telling you that there's actually something wrong with your code. It's just
 not wrong enough to be against the language spec and therefore always be an
 error. Scheduling something for deprecation is indicating that the symbol
 in
 question will be deprecated in the future and that you should change it
 before
 that happens. Your code is still fine, and it should still compile.

 Bottom line. Marking something as scheduled for deprecation should
 _never_
 break code no matter what flags you use to compile your code. Otherwise,
 there's no point to it, and we'd just be deprecating stuff immediately.


I would argue that when you compile with -w (and explicitly -w, not -wi),
you're explicitly asking the compiler to break your code for warnings, and I
believe that should include code scheduled for deprecation. By specifying
-w, you're explicitly asking the compiler to check your code more strictly,
and I see more aggressive deprecation as an acceptable part of that.

To paraphrase your description, there's something that's about to break in
your code, but it's not broken yet, so if you drop -w (or switch to -wi),
you can still build it. If we're taking the approach that warnings break
code when -w is used, I see scheduled deprecations falling into a very
similar category.

And no, this change doesn't obsolete code deprecation, it simply extends the
higher standards that -w holds you to into the library space. If you don't
want scheduled for deprecation to break your code, use -wi. You'll get all
the same noise you got before, just without the breakage.


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Nick Sabalausky
Jonathan M Davis jmdavisp...@gmx.com wrote in message 
news:mailman.1542.1310418661.14074.digitalmars-d-annou...@puremagic.com...

 Yes. But the problem is that the scheduled for deprecation messages are 
 not
 supposed to _ever_ break code. And since warnings aren't normally added 
 very
 often, compiling with -w shouldn't cause your code to suddenly break. 
 Granted,
 dmd is still unstable enough that such changes do occur, but once it's 
 fully
 stable, it wouldn't happen very often. But anyone can schedule something 
 for
 deprecation in any library, and the whole point of _scheduling_ the
 deprecation instead of just deprecating it is to avoid breaking code. So, 
 it's
 unacceptable for scheduling something for deprecation to be an error 
 with -w.
 It's informational only. Warnings are _not_ only informational. They're
 telling you that there's actually something wrong with your code.

Something *potentially* wrong. If it actually *knew* that it was wrong it 
would have been an error in the first place, not a warning.

And scheduled for deprecation is literally saying your code *will* be 
wrong, and you *do* need to address it by X deadline. That's arguably even 
stronger than certain warnings, because some warnings (by the very nature of 
warnings) are false positives.

I don't really have a problem with the argument that scheduling something 
for deprecation shouldn't break code. But I think that's really more an 
argument against indiscriminate use of warnings as errors in general 
(which, again, isn't something I've ever felt a strong need for anyway - not 
that I'm advocating getting rid of it, that would probably annoy some 
people). In any case, the whole point of warnings as errors is that the 
user (for whatever possibly-questionable reason) *wants* the compiler to 
bail on anything that isn't guaranteed perfect (to the best of the 
compiler's ability).

 It's just
 not wrong enough to be against the language spec and therefore always be 
 an
 error. Scheduling something for deprecation is indicating that the symbol 
 in
 question will be deprecated in the future and that you should change it 
 before
 that happens. Your code is still fine, and it should still compile.

 Bottom line. Marking something as scheduled for deprecation should 
 _never_
 break code no matter what flags you use to compile your code. Otherwise,
 there's no point to it, and we'd just be deprecating stuff immediately.

 - Jonathan M Davis 




Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On 2011-07-11 14:32, Nick Sabalausky wrote:
 Jonathan M Davis jmdavisp...@gmx.com wrote in message
 news:mailman.1542.1310418661.14074.digitalmars-d-annou...@puremagic.com...
 
  Yes. But the problem is that the scheduled for deprecation messages are
  not
  supposed to _ever_ break code. And since warnings aren't normally added
  very
  often, compiling with -w shouldn't cause your code to suddenly break.
  Granted,
  dmd is still unstable enough that such changes do occur, but once it's
  fully
  stable, it wouldn't happen very often. But anyone can schedule something
  for
  deprecation in any library, and the whole point of _scheduling_ the
  deprecation instead of just deprecating it is to avoid breaking code. So,
  it's
  unacceptable for scheduling something for deprecation to be an error
  with -w.
  It's informational only. Warnings are _not_ only informational. They're
  telling you that there's actually something wrong with your code.
 
 Something *potentially* wrong. If it actually *knew* that it was wrong it
 would have been an error in the first place, not a warning.
 
 And scheduled for deprecation is literally saying your code *will* be
 wrong, and you *do* need to address it by X deadline. That's arguably even
 stronger than certain warnings, because some warnings (by the very nature
 of warnings) are false positives.
 
 I don't really have a problem with the argument that scheduling something
 for deprecation shouldn't break code. But I think that's really more an
 argument against indiscriminate use of warnings as errors in general
 (which, again, isn't something I've ever felt a strong need for anyway -
 not that I'm advocating getting rid of it, that would probably annoy some
 people). In any case, the whole point of warnings as errors is that the
 user (for whatever possibly-questionable reason) *wants* the compiler to
 bail on anything that isn't guaranteed perfect (to the best of the
 compiler's ability).

Honestly, I would consider it bad practice to leave warnings in code. Leaving 
them in as you're messing with code is fine, because they're not immediately 
fatal, but they _are_ problems. If they weren't, then they shouldn't have been 
warnings in the first place. But I tend to mostly agree with Walter that 
something should either be an error or not. Warnings are for things which are 
definitely wrong but not illegal in the language. Certainly, that's how dmd 
treats them. I know that other compilers love to complain about other stuff 
that doesn't really matter but _could_ be a bug, but once you do that, people 
start letting warnings sit there, and _real_ problems get buried in the mess.

So, obviously, we have a very different view of warnings. But regardless, it's 
going to cause problems if scheduling something for deprecation causes code to 
break. The whole point is to inform programmers that they're going to need to 
change their code soon and to avoid immediate code breakage. Treating 
scheduled for deprecation as a warning doesn't do that.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Adam Ruppe
Jonathan M Davis:
 If it gives you  stack trace though, I guess that it would help,
 though it would certainly be ugly.

It's not too ugly at all, since it's a template stack trace - so in
a lot of cases, it isn't a very long list.

Regardless though, something is better than nothing.

 Fortunately, in the case of something like tolower, _every_
 function called

Indeed, though another one was repeat() with replicate(), which isn't
as simple without the compiler's help.

While a proper warning is surely better than a filthy hack, if it's
not coming, adding a versioned static assert is a low cost alternative
we can do immediately.


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Michel Fortin

On 2011-07-11 17:26:15 -0400, Andrew Wiley wiley.andre...@gmail.com said:


To paraphrase your description, there's something that's about to break in
your code, but it's not broken yet, so if you drop -w (or switch to -wi),
you can still build it. If we're taking the approach that warnings break
code when -w is used, I see scheduled deprecations falling into a very
similar category.


To paraphrase your paraphrase, there's something that's about to break 
in your code, but it's not broken yet so if you add -d you can still 
build it... I'm simply side-stepping that discussion about 
implementation to illustrate that you just described the purpose of the 
'deprecated' keyword.


Personally, I think adding warnings or even messages for each and every 
scheduled-for-deprecation function is too much. Just adding it to the 
documentation and adding a note in the changelog should be enough. 
Then, one day, it'll be deprecated for real and you'll get an error 
unless you use -d.


I think one deprecation level is enough. The scheduled for deprecation 
step is still useful so that early adopters can try the new way to do 
things and report problems. Once it's been stable and adopted by some 
people you can ask for mass adoption by adding a deprecation message. 
But nagging users when they're using something that is scheduled for 
deprecation is pretty much the same as having the feature deprecated 
immediately in my view.


--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/



Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On 2011-07-11 16:09, Michel Fortin wrote:
 On 2011-07-11 17:26:15 -0400, Andrew Wiley wiley.andre...@gmail.com said:
  To paraphrase your description, there's something that's about to break
  in your code, but it's not broken yet, so if you drop -w (or switch to
  -wi), you can still build it. If we're taking the approach that warnings
  break code when -w is used, I see scheduled deprecations falling into a
  very similar category.
 
 To paraphrase your paraphrase, there's something that's about to break
 in your code, but it's not broken yet so if you add -d you can still
 build it... I'm simply side-stepping that discussion about
 implementation to illustrate that you just described the purpose of the
 'deprecated' keyword.
 
 Personally, I think adding warnings or even messages for each and every
 scheduled-for-deprecation function is too much. Just adding it to the
 documentation and adding a note in the changelog should be enough.
 Then, one day, it'll be deprecated for real and you'll get an error
 unless you use -d.
 
 I think one deprecation level is enough. The scheduled for deprecation
 step is still useful so that early adopters can try the new way to do
 things and report problems. Once it's been stable and adopted by some
 people you can ask for mass adoption by adding a deprecation message.
 But nagging users when they're using something that is scheduled for
 deprecation is pretty much the same as having the feature deprecated
 immediately in my view.

Well, we've been doing it with pragmas for a while (which was Andrei's idea 
IIRC). We just haven't been very organized about it, and I've been trying to 
better organize what we're doing with deprecation. And since it only works 
with full modules or with templated functions (since otherwise the pragma 
would bug everyone rather than just those using the symbol in question), it 
can't be used everywhere anyway.

The problem with not having a message is that people aren't likely to look at 
the documentation unless they aren't all that familiar with the function, so 
people will continue to happily use the function up to the point that it's 
actually deprecated, and then they'll be surpised when their code breaks 
(since suddenly needing -d for your code to compile _is_ breaking your code). 
Walter in particular doesn't like the idea of people suddenly having to go and 
change their build scripts to use -d or immediately fix their code without any 
warning, which is why we don't deprecate immediately. And just putting it in 
the documentation really isn't much better than deprecating it immediately, 
because the very people who most need to see the message are the least likely 
to read the documentation.

Now, if most people don't like the idea of messages about stuff being 
scheduled for deprecation being printed, then we'll likely stop having them. 
But it kind of defeats the purpose of scheduling it for deprecation rather 
than immediately deprecating it if we do that.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Michel Fortin

On 2011-07-11 19:56:28 -0400, Jonathan M Davis jmdavisp...@gmx.com said:


The problem with not having a message is that people aren't likely to look at
the documentation unless they aren't all that familiar with the function, so
people will continue to happily use the function up to the point that it's
actually deprecated, and then they'll be surpised when their code breaks
(since suddenly needing -d for your code to compile _is_ breaking your code).
Walter in particular doesn't like the idea of people suddenly having to go and
change their build scripts to use -d or immediately fix their code without any
warning, which is why we don't deprecate immediately.


Very true. I take this as an indication that the current implementation 
of the `deprecated` keyword is too strict by default. If it's bad that 
using a deprecated function breaks the code by default, then make using 
a deprecated function non-fatal unless the user asks for it to be fatal.


To me, something scheduled for deprecation means that you know it'll be 
deprecated eventually, but that for now it's still okay using it. For 
instance, std.xml could be scheduled for deprecation, once we have a 
replacement we can deprecate it and nag people about using the new one. 
If you nag people immediately, then it's almost as good as deprecated 
already.


That said, there's also the problem that the implementation of the 
scheduled for deprecation messages isn't very good. It'll work for 
modules, it'll work for template functions, but you don't know who 
imported the module or called the function. Moreover, calling a 
deprecated function from within a deprecated function yields no error; 
calling a scheduled-for-deprecation function from a 
scheduled-for-deprecation one or even a deprecated one will show an 
annoying message. Does that makes sense?


Instead of working on fragile workarounds, better fix the problem, 
which is that `deprecated` is too strict by default.



--
Michel Fortin
michel.for...@michelf.com
http://michelf.com/



Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Leandro Lucarella
Jonathan M Davis, el 11 de julio a las 18:15 me escribiste:
  Despite the confusing non-standard descriptions in --help, -w is the Treat
  warnings as errors setting, so it *should* stop compilation - that's the
  whole point of -w. The proper Turn warnings on setting is -wi, not -w.
 
 True. But when we're dealing with messages for something which is scheduled 
 for deprecation

What's the point of scheduled for deprecation anyway? Things are
deprecated, or aren't, anything else should be in the documentation. You
can always use deprecated features using a compiler, so again... what's
the point of scheduled for deprectation? I can't really understand
that concept.

-- 
Leandro Lucarella (AKA luca) http://llucax.com.ar/
--
GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145  104C 949E BFB6 5F5A 8D05)
--
mazzi gmail is down?
 Luca waiting for mail.google.com
mazzi ya vendí todas mis acciones de google en los mercados asiaticos
 Luca se viene la ecatombe
mazzi mal
mazzi es como que te corten el porno en una tarde al pedo en tu casa


Re: dmd 1.069 and 2.054 release

2011-07-11 Thread Jonathan M Davis
On Tuesday 12 July 2011 01:28:11 Leandro Lucarella wrote:
 Jonathan M Davis, el 11 de julio a las 18:15 me escribiste:
   Despite the confusing non-standard descriptions in --help, -w is the
   Treat warnings as errors setting, so it *should* stop compilation
   - that's the whole point of -w. The proper Turn warnings on
   setting is -wi, not -w.
  
  True. But when we're dealing with messages for something which is
  scheduled for deprecation
 
 What's the point of scheduled for deprecation anyway? Things are
 deprecated, or aren't, anything else should be in the documentation. You
 can always use deprecated features using a compiler, so again... what's
 the point of scheduled for deprectation? I can't really understand
 that concept.

The idea is to have 3 stages while deprecating something.

1. Scheduled for Deprecation.
2. Deprecated.
3. Removed.

When a symbol has been deprecated, -d is required to compile any code using 
that symbol. So, deprecation breaks code. You either have to change your code 
so that it doesn't use the deprecated symbol, or you have to change your build 
scripts to use -d. In either case, deprecating a symbol without warning is 
going to cause problems for anyone maintaining code which uses that symbol.

So, in the scheduled for deprecation stage, programmers are warned that a 
symbol will be deprecated in the near future, but the symbol hasn't been 
deprecated yet, so no code is broken, and no build scripts need to b changed. 
Programmers then have time to rework their code to no longer use the soon-to-
be deprecated symbol without having their code break or having to change their 
build scripts.

If a programmer has not done anything about the symbol before it's actually 
deprecated, then they will have to change their code or change their bulid 
scripts to use -d when the symbol is actually deprecated, but because there 
was the scheduled for deprecation phase, the programmer at least had fair 
warning about the impending code breakage and could have avoided it had they 
wanted to.

What it comes down to is that we don't want to suddenly break anyone's code. 
If breaking changes need to be made, we want to provide a smooth path, giving 
people time to rework their code rather than suddenly breaking their code. 
Needing to rework your code can be annoying enough without your code suddenly 
breaking due to a library update.

- Jonathan M Davis


Re: dmd 1.069 and 2.054 release

2011-07-10 Thread Daniel Murphy
Jonathan M Davis jmdavisp...@gmx.com wrote in message 
news:mailman.1520.1310357559.14074.digitalmars-d-annou...@puremagic.com...
 Now, if deprecated were improved to take a message (and to allow for soft
 deprecation, since the messages printing here are about stuff being 
 scheduled
 for deprecation rather than actually being deprecated yet), then maybe 
 they
 could give a useful file and line number (at least for the functions), 
 since
 then the compiler would know that a function was scheduled for deprecation 
 and
 could warn you about using it. But since the best that we have for that is
 pragmas, that doesn't work. And actually, without that sort of feature, 
 any
 function that isn't a template can't even have such a message - at best it 
 can
 have a note in the documentation.


Would the following cover all the common use cases? (Phobos seems to be the 
biggest user of deprecated so far)

deprecated(message) int a;
deprecated(message, warn) int b;

With deprecated(warn) messages only being displayed with warnings enabled.

As in, an implementation of 
http://d.puremagic.com/issues/show_bug.cgi?id=5481