Changeset 635

Show
Ignore:
Timestamp:
08/27/10 23:51:12 (1 year ago)
Author:
walter
Message:

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

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dmd-1.x/src/template.c

    r632 r635  
    966966 
    967967    // Loop through the function parameters 
    968     for (i = 0; i < nfparams; i++) 
     968    for (size_t parami = 0; parami < nfparams; parami++) 
    969969    { 
    970970        /* Skip over function parameters which wound up 
    971971         * as part of a template tuple parameter. 
    972972         */ 
    973         if (i == fptupindex) 
    974         {   if (fptupindex == nfparams - 1) 
    975                 break; 
     973        if (parami == fptupindex) 
     974            continue; 
     975        /* Set i = index into function arguments 
     976         * Function parameters correspond to function arguments as follows. 
     977         * Note that tuple_dim may be zero, and there may be default or 
     978         * variadic arguments at the end. 
     979         *  arg [0..fptupindex] == param[0..fptupindex] 
     980         *  arg [fptupindex..fptupindex+tuple_dim] == param[fptupindex] 
     981         *  arg[fputupindex+dim.. ] == param[fptupindex+1.. ] 
     982         */ 
     983        i = parami; 
     984        if (fptupindex >= 0 && parami > fptupindex) 
    976985            i += tuple_dim - 1; 
    977             continue; 
    978         } 
    979  
    980         Parameter *fparam = Parameter::getNth(fparameters, i); 
     986 
     987        Parameter *fparam = Parameter::getNth(fparameters, parami); 
    981988 
    982989        if (i >= nfargs)                // if not enough arguments 
  • trunk/src/template.c

    r632 r635  
    10901090 
    10911091    // Loop through the function parameters 
    1092     for (i = 0; i < nfparams; i++) 
     1092    for (size_t parami = 0; parami < nfparams; parami++) 
    10931093    { 
    10941094        /* Skip over function parameters which wound up 
    10951095         * as part of a template tuple parameter. 
    10961096         */ 
    1097         if (i == fptupindex) 
    1098         {   if (fptupindex == nfparams - 1) 
    1099                 break; 
     1097        if (parami == fptupindex) 
     1098            continue; 
     1099        /* Set i = index into function arguments 
     1100         * Function parameters correspond to function arguments as follows. 
     1101         * Note that tuple_dim may be zero, and there may be default or 
     1102         * variadic arguments at the end. 
     1103         *  arg [0..fptupindex] == param[0..fptupindex] 
     1104         *  arg [fptupindex..fptupindex+tuple_dim] == param[fptupindex] 
     1105         *  arg[fputupindex+dim.. ] == param[fptupindex+1.. ] 
     1106         */ 
     1107        i = parami; 
     1108        if (fptupindex >= 0 && parami > fptupindex) 
    11001109            i += tuple_dim - 1; 
    1101             continue; 
    1102         } 
    1103  
    1104         Parameter *fparam = Parameter::getNth(fparameters, i); 
     1110 
     1111        Parameter *fparam = Parameter::getNth(fparameters, parami); 
    11051112 
    11061113        if (i >= nfargs)                // if not enough arguments