[Issue 4652] Compiler hangs on template with zero-length tuple and another argument

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Aug 18 06:37:41 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=4652


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch


--- Comment #4 from Don <clugdbug at yahoo.com.au> 2010-08-18 06:37:38 PDT ---
This is caused by a confusion in the code for deduceFunctionTemplateMatch.
The comment and loop condition implies that we're looping over the function
_parameters_. But the rest of the loop assumes it's a loop over the function
_arguments_.
In the case where the tuple is of length zero, an infinite loop results.
Apart from the ICE, this also causes valid code to be rejected. 
------
void bug4652(U, T...)(long y, T x, U num){}
void instantiate4652()
{
    bug4652(2, 'c', 27, 'e', 'f',1); // rejects-valid
    bug4652(2, 1);  // infinite loop on valid code
}
----

PATCH: template.c line 1090. Replace the first section of code, with the
second.
---------------
    // Loop through the function parameters
    for (i = 0; i < nfparams; i++)
    {
        /* Skip over function parameters which wound up
         * as part of a template tuple parameter.
         */
        if (i == fptupindex)
        {   if (fptupindex == nfparams - 1)
                break;
            i += tuple_dim - 1;
            continue;
        }

        Parameter *fparam = Parameter::getNth(fparameters, i);
---------------
    // Loop through the function arguments
    for (i = 0; i < nfargs; i++)
    {
        /* Skip over function parameters which wound up
         * as part of a template tuple parameter.
         */
        if (i >= fptupindex && i< fptupindex+tuple_dim)
            continue;
        /* Function parameters correspond to function arguments as follows.
         * Note that tuple_dim may be zero.
         * arg [0..fptupindex] == param[0..fptupindex]
         * arg [fptupindex..fptupindex+tuple_dim] == param[fptupindex]
         * arg[fputupindex+dim..nfargs] == param[fptupindex+1..nfparams]
         */
        size_t parami = i;
        if (fptupindex >= 0 && i >= fptupindex) {
            parami -= tuple_dim-1;
        }
        Parameter *fparam = Parameter::getNth(fparameters, parami);
--------

-- 
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