Summary: ctfe return value is handled incorrectly when used as
                    template argument
           Product: D
           Version: 2.041
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD

--- Comment #0 from Z�lyomi Istv�n <> 2010-03-24 00:59:45 
PDT ---
Note that the dmd version I was working with was 2.042, but it was still
unavailable in the version list. The reduced test case is the following:

import std.metastrings;

// dummy ctfe-capable function needed to reproduce the error
long parseLong(string timeStr) { return 42; }

// ctfe-capable function to demonstrate that a value is calculated in
string longToStr(long val)
    if (val < 10) { return "" ~ cast(char)(val + '0'); }
    else { return longToStr(val / 10) ~ longToStr(val % 10); }

void main(string[] args)
    const long mylong = parseLong("mystring");
    pragma(msg, "fine ", longToStr(mylong) ); // compiles and prints
    pragma(msg, "bug? ", std.metastrings.toStringNow!(mylong) ); // error

For this code, the compiler output is

fine 42
bug? c:\Program Files\.....\src\phobos\std\metastrings.d(97): Error: expression
mylong < 0L is not constant or does not evaluate to a bool

I think this is a bug, toStringNow should work just as like longToStr. I
checked its source code, but found no reason for the compile error, it seems to
do the same thing with templates as longToStr with ctfe. The bug was confirmed
on the newsgroups, see thread starting with

Configure issuemail:
------- You are receiving this mail because: -------

Reply via email to