[Issue 8261] std.traits.ParameterTypeTuple may break existing codes
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Jun 18 13:29:28 PDT 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8261
Manu <turkeyman at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |turkeyman at gmail.com
--- Comment #1 from Manu <turkeyman at gmail.com> 2012-06-18 13:31:45 PDT ---
(In reply to comment #0)
> In 2.060head, is(FuncType PT == function) -> PT contains parameter identifiers.
> This change is introduced the commit:
>
> https://github.com/D-Programming-Language/dmd/commit/65acb8ca382f3cd2abea058552d78c147163a8fa
>
> It is useful for more metaprogramming, but this change may break existing codes
> that using std.traits.ParameterTypeTuple. See below sample code:
>
> void foo(int num, string name, int[int] map){}
> pragma(msg, ParameterTypeTuple!foo);
> // In 2.059, prints (int, string, int[int])
> // In 2.060head, prints (int num, string name, int[int] map)
>
> void bar(ParameterTypeTuple!foo num) {}
> // Error: function test.bar parameter bar.num is already defined
>
> ====
>
> If we change the implementation of ParameterTypeTuple template like follows:
>
> template ParameterTypeTuple(func...)
> if (func.length == 1 && isCallable!func)
> {
> static if (is(FunctionTypeOf!(func) P == function))
> {
> //alias P ParameterTypeTuple;
>
> // Remove parameter names that original function has.
> template Id(T) { alias T Id; }
> alias staticMap!(Id, P) ParameterTypeTuple;
> }
> else
> static assert(0, "argument has no parameters");
> }
>
> We can get 'a tuple that contains only parameter types', but it also removes
> parameter storage class... breaking existing codes REVISITED!
>
> void foo(ref int x){}
> pragma(msg, ParameterTypeTuple!foo); // will prints (int), not (ref int)
>
>
> ====
>
> In current dmd, all of function parameters have names, written by user, or
> named by compiler internally (e.g. _param_0). Then we never get a tuple of
> 'parameter type with storage class but unnamed'.
> Then, if we want to parameter type tuple with storage classes, we cannot remove
> parameter name informations from the tuple.
> As far as I know, there is no workaround. So I think we should revert the
> commit 65acb8ca.
Can the new behaviour be expressed with a new ParameterTuple! trait or
something?
ParameterTypeTuple! makes sense as just types, but it would be nice to see a
suite: ParameterTyple! with all details, ParameterNameTuple! just names,
ParameterDefaultArgTuple!, you get the idea... ?
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list