[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