[Sema] Avoid applying diagnostic hack to caller-side expression macros #82724
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When type-checking a caller-side expression macro default argument in a context where name lookup is unable to resolve it (but is able to resolve it in the parameter), we were previously exiting with a non-zero exit code without emitting any diagnostic. This was due to the fact that
DiagnosticState::determineBehavioris stateful, meaning that queryingDiagnosticTransaction::hasErrorscould flip the "had error" bit for the DiagnosticEngine even if the transaction got later aborted.This PR splits off the stateful bit of
DiagnosticState::determineBehaviorinto a new function that we call during diagnostic emission. This then exposed the actual underlying issue here, which is that the diagnostic hack we have for caller-side default arguments, where we expect them to fail in the parameter if they fail at the call-site, is unsound for expression macros since name lookup may differ depending on context. Limit the hack such that it only applies to simple literals (magic literals +nil,[], and[:]).rdar://154771596