On 01/24/2011 10:07 PM, bearophile wrote:
spir:

Certainly ref qualifiers should be checked,
shouldn't they? The situation indeed is somewhat special here.

Foo getFoo(Token[] tokens, ref uint index)
{...}
Term[] getTerms (Term) (Term function (Token[], uint) parseFunc, Token[] tokens)
{...}
void main()
{
      Foo[] foos = getTerms!(Foo)(&getFoo, s);      # ==>  segfault
}

Please, create a very small but complete program that shows the problem :-) It 
will go to Bugzilla.

Bye,
bearophile

I guess this does the job? (replaced token stream with plain stream, for the example, thus it's really artificial since getFloat just does what parse!float would do, but well... shows the bug).

float getFloat(string s, ref uint index) {
    if (index >= s.length)
        return -1;

    float fl;
    string[] ss = s[index..$].split();
    string s0 = ss[0];

    try
        fl = to!float(s0);
    catch (Exception _)
        return -1;
    index += s0.length;
    return fl;
}

Term[] terms (Term) (Term function (string, uint) parseFunc, string s) {
    Term[] terms = [];
    Term term;
    uint index = 0;
    static enum SEP = ' ';

    term = parseFunc(s, index);
    if (term != -1) {
        terms ~= term;
        while (true) {
            if (index >= s.length || s[index] != SEP)
                break;
            ++ index;
            term = parseFunc(s, index);
            if (term == -1)
                break;
            terms ~= term;
        }
    }

    return terms;
}

unittest {
    string s = "3.33 1.0 2.2";
    float[] floats = terms!(float)(&getFloat, s);
    writeln(floats);
}

If you replace "uint" by "ref uint" in terms' signature, works fine.

Denis
--
_________________
vita es estrany
spir.wikidot.com

Reply via email to