/* We used to ICE as we did not mark a Vop for rename as we changed a function call to a normal modify statement while folding exp(0.0); */ double exp(double); void f0(void); void f(double); typedef struct Parser { int x; char *s; } Parser; static double pop(Parser *p) { if (p->s[0] <= 0) { f0(); return 0; } --p->x; return 0; } static void evalFactor(Parser *p) { while (p->x) f(exp(pop(p))); } static void evalTerm(Parser *p) { while (p->s[0]) evalFactor(p); } static void evalExpression(Parser *p) { evalTerm(p); while (p->s[0]) evalTerm(p); } void evalPrimary(Parser *p) { if (p->s) return; evalExpression(p); }