CTFE calling a template: Error: expression ... is not a valid template value argument

Timon Gehr timon.gehr at gmx.ch
Thu Sep 20 16:13:44 PDT 2012


On 09/20/2012 11:22 PM, Jens Mueller wrote:
> Hi,
>
> I do not understand the following error message given the code:
>
> string foo(string f)
> {
>      if (f == "somestring")
>      {
>          return "got somestring";
>      }
>      return bar!(foo("somestring"));
> }
>
> template bar(string s)
> {
>      enum bar = s;
> }
>
> I'll with dmd v2.060 get:
> test.d(7):        called from here: foo("somestring")
> test.d(7):        called from here: foo("somestring")
> test.d(7):        called from here: foo("somestring")
> test.d(7): Error: expression foo("somestring") is not a valid template value argument
> test.d(12):        called from here: foo("somestring")
> test.d(12):        called from here: foo("somestring")
> test.d(7): Error: template instance test.bar!(foo("somestring")) error instantiating
>
> In line 7 I call the template bar. But I call with the string that is
> returned by the CTFE of foo("somestring") which should return "got
> somestring" but instead it seems that an expression is passed. How do I
> force the evaluation foo("somestring")?
> I haven't found a bug on this.
>
> Jens
>

You can file a diagnostics-bug.

The issue is that CTFE can only interpret functions that are fully
analyzed and therefore the analysis of foo depends circularly on
itself. The compiler should spit out an error that indicates the
issue.

You could post an enhancement request to allow interpretation of
incompletely-analyzed functions, if you think it is of any use.

http://d.puremagic.com/issues


More information about the Digitalmars-d mailing list