On Monday, 20 June 2016 at 18:59:09 UTC, Jacob Carlborg wrote:
On 2016-06-20 14:33, Guillaume Chatelet wrote:

Problem 2:
----------
Template arguments that are of basic types are mangled in a special way
which requires to understand which 'int' is which.

extern(C++) A foo(A, B)(B, A, B);
static assert(foo!(int,int).mangleof == "_Z3fooIiiET_T0_S0_S1_");

In the example above the first 'int' is not the same as the second one,
it's a distinct substitution.

Question:
---------
- How can I know which is which since from the AST perspective, the
FunDeclaration's Parameters are just TypeBasic 'int'?

------------------------------------------------------------

Not sure I understand the question.

Sorry about not being too clear.

Are you saying that the two integers are mangled differently because there are two template parameters?

Yes exactly.

I'm guessing you need to look at the template declaration to get more information about the template parameters.

The TemplateInstance [1] gives me `tiargs` and `tdtypes`.

    // Array of Types/Expressions of template
    // instance arguments [int*, char, 10*10]
    Objects* tiargs;

    // Array of Types/Expressions corresponding
    // to TemplateDeclaration.parameters
    // [int, char, 100]
    Objects tdtypes;

I'm using `tiargs` right now (I'm not really sure what `tdtypes` is).

AFAIU I can access TemplateDeclaration from TemplateInstance through `tempdecl` even though it's stored as a Dsymbol.

I'll have a look at `parameters` from TemplateDeclaration [2] but I still need to match it to the function arguments somehow. The following example illustrates the process of pairing the int to the template parameter.

    extern(C++) B foo(A, B)(*B, ref const A);

    foo!(int, int) => int foo(*int, ref const int);
          ^    ^       ^        ^              ^
          1    2       2        1              2

1. https://github.com/dlang/dmd/blob/master/src/dtemplate.d#L5895
2. https://github.com/dlang/dmd/blob/master/src/dtemplate.d#L406

Reply via email to