Bug 4133 – Enable __traits on D1

Status
RESOLVED
Resolution
INVALID
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
All
Creation time
2010-04-29T01:42:00Z
Last change time
2015-06-09T05:13:48Z
Keywords
patch
Assigned to
nobody
Creator
nfxjfg

Attachments

IDFilenameSummaryContent-TypeSize
616TRAITS_PATCHenable __traits in D1text/plain19868

Comments

Comment #0 by nfxjfg — 2010-04-29T01:42:05Z
Not having __traits is a pain in the ass, and I bet there's not a single technical reason not to enable it on D1. Names prefixed with __ are compiler reserved, and thus can't break existing D1 programs.
Comment #1 by nfxjfg — 2010-05-01T11:14:41Z
Created attachment 616 enable __traits in D1 I figured it was unfair to leave all the work to Walter, so I wrote a patch. It was simple: mostly I had to remove a bunch of "#if DMDV2", and copy some missing bits from the D2 source tree (which is slightly different from the D1 tree, whatever). The D1 traits.c file was outdated (I don't know why), so I just appended D2's traits.c to it (to keep the diff non-confusing). Note that I still made s small change to the copied part, oh well. I tried all examples from http://www.digitalmars.com/d/2.0/traits.html, and all seemed to work correctly. Note that you can't write "auto b = [ __traits(allMembers, D) ];" in D1, instead you have to use "char[][] b = [ __traits(allMembers, D) ];" (array type inference was changed in D2). This patch is against the dmd 1.059 Beta, which (probably) corresponds dmd svn revision 461.
Comment #2 by clugdbug — 2010-05-06T00:51:10Z
This is quite premature, since __traits is still experimental in D2, and its syntax will hopefully change. It is deliberately not mentioned in Andrei's book.
Comment #3 by nfxjfg — 2010-05-06T01:09:09Z
That's true, but it can change in D1 as well. If enhancement #3702 gets accepted, the magic namespace can be prefixed with "std." or "__" in D1 to maintain backwards compatibility. But I don't really think __traits will go away so fast. Anyway, this feature would be really helpful. Many D1 users are tired of parsing .stringof results to get their stuff done, but they can't suddenly switch to D2 either.
Comment #4 by hoganmeier — 2010-05-26T15:13:13Z
> you have to use "char[][] b = [__traits(allMembers, D) ];" allMembers returns a tuple now which is a lot better for compile-time iterations.
Comment #5 by nfxjfg — 2010-05-26T15:37:29Z
I was just saying you have to use "char[][] b = [...]" instead of "auto b = [...]". This is the only point where you have to modify the examples in the traits documentation to make it work on D1+this patch. That change doesn't have to do anything with __traits or this patch. It's just that "auto b = ["a", "bc"];" simply doesn't compile in D1.