If semantic analysis does not cause errors, the process can modify original AST. It's for memory efficiency, and for the situation, COW is redundant (we don't need to save the not-yet-semanticed AST).

On the other hand, if semantic analysis cause any errors, we should not store the ErrorExp into the original AST. Because:
- original AST might be reused if this semantic analysis is under the gagging.
- some diagnostic report  will use original AST (eg. `static assert` will print its original condition expression). Storing ErrorExp in the original AST will show `__error` in those diagnostic messages (and it's bad).

So, I think that a expression semantic processing should return:
1. completely valid and typed AST
2. or an ErrorExp, and a part of the original AST might be substituted with *valid AST* (so original AST never contain ErrorExp). Therefore, repeating semantic analysis on original AST will cause same error with the first semantic processing.

COW is the most conservative way. But currently dmd uses much memory for semantic analysis. it would make compile-time memory footprint worse.

And, today it's very difficult to stop using error gagging mechanism. The logic that I explained would be safe for gagging.