[Issue 3379] [tdpl] Parameter names not visible in the if clause of a	template
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Fri Oct 16 00:33:38 PDT 2009
    
    
  
http://d.puremagic.com/issues/show_bug.cgi?id=3379
Don <clugdbug at yahoo.com.au> changed:
           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug at yahoo.com.au
           Platform|Other                       |All
            Version|unspecified                 |2.032
         OS/Version|Linux                       |All
           Severity|normal                      |enhancement
--- Comment #1 from Don <clugdbug at yahoo.com.au> 2009-10-16 00:33:37 PDT ---
I've convinced myself that this isn't too difficult, but it contains a lot of
subtlties. I don't have a complete patch, but I've got basic cases working.
Basically in deduceFunctionTemplateMatch() you need to create variables for
each of the parameters (by analogy to func.c line 904).
    for (i = 0; i < nfparams; i++)
    {
    Argument *fparam = Argument::getNth(fparameters, i);
    if (!fparam->ident) continue; // don't add it, if it has no name
    Type *vtype = // get the type, not sure how to do this properly
    ... deal with pure, etc.
    VarDeclaration *v = new VarDeclaration(loc, vtype, fparam->ident, NULL);
... set the storage class
    v->semantic(paramscope);
    if (!paramscope->insert(v)) error("parameter %s.%s is already defined",
toChars(), v->toChars());
}
Not sure how to deal with deal with the different flavours of variadics,
though.
I originally thought that in TemplateDeclaration::matchWithInstance() you'd be
able avoid checking the constraint again if it's a function template, but you
can't because of cases like:
T1[] find(T1, T2)(T1[] longer, T2[] shorter) if (false) 
{
   assert(0);
   return longer;
}
void main() {
   double[] d1 = [ 6.0, 1.5, 2.4, 3 ];
   double[] d2 = [ 1.5, 2.4 ];
   assert(find!(double, double)(d1, d2) == d1[1 .. $]); // THIS MUST NOT
COMPILE.
}
So it needs to have the same thing, wrapped in a 
     FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration();
     if (fd) {
   ...
}
-- 
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