While working on D54349, it was noted that the SourceRange returned from the preprocessor callbacks was bogus. It was expected to pass the source range for the condition to a #if or #elif directive, but what was actually passed was a much larger range that could even include all of the conditionally skipped tokens.
This patch adjusts the source range passed in to the callbacks to only include the condition range itself by tracking that information a bit better in the preprocessor.
Is CondBegin still needed after your changes?