[name := ] NOFOLD( expression )
name | Optional. The identifier for this function. |
expression | The expression to evaluate. |
The NOFOLD function creates a barrier that prevents optimizations occurring between the expression and the context it is used in. This is used to prevent constant-folding in the context so that it may be evaluated as-is. Note that this does not prevent constant-folding within the expression itself. It is normally only used to prevent test cases being optimized into something completely different, or to temporarily work around bugs in the compiler.
Example:
OUTPUT(2 * 2); // is normally constant folded to:
OUTPUT(4); // at compile time.
//However adding NOFOLD() around one argument prevents that
OUTPUT(NOFOLD(2) * 2);
//Adding NOFOLD() around the entire expression does NOT
// prevent folding within the argument:
OUTPUT(NOFOLD(2 * 2));
//is the same as
OUTPUT(NOFOLD(4));