This seems to be a tail recursion problem? Calling the function recursively (while ignoring the result) seems to clobber the local value of the variable.
I'm not sure if line (3) is the same bug or not; there seems to be a morass of related bugs in the CTFE stuff.
-----------------
int exprLength(char [] s)
{
int numParens=0;
for (int i=0; i<s.length; ++i) {
if (s[i]=='(') { numParens++; }
if (s[i]==')') { numParens--; }
if (numParens == 0) { return i; }
}
}
char [] makePostfix(char [] operations)
{
if (operations.length<2) return "x";
int x = exprLength(operations);
char [] first="bad";
if (x>0) {
first = "ok";
char [] ignore = makePostfix(operations[1..x]); // This makes (2) fail.
}
return first;
}
void main()
{
char [] q = makePostfix("(a+b)*c");
assert(q=="ok"); // (1) PASSES
const char [] q2 = makePostfix("(a+b)*c");
static assert(q2=="ok"); // (2) FAILS
static assert(makePostfix("(a+b)*c")=="ok"); // (3) not evaluatable at compile time
}