On Wed, 6 Mar 2019 at 15:37, David Aldrich <david.aldrich.ntml@xxxxxxxxx> wrote: > > > The error comes from the #error directive, so that's the location shown. > > Ok, thanks. So I take it that this is expected behaviour. Yes, I would be be surprised by any other behaviour. If it showed the condition, what would you want the location to be for: #if __cplusplus >= 201703L #include <optional> using std::optional; #elif __has_include(<experimental/optional>) #include <experimental/optional> using std::experimental::optional; #else #error No optional type available #endif It would not be helpful to show: e.C:7:1: error: #error No optional type available #else ^ And if you're going to show the preceding condition that the #else corresponds to, which one? The programmer has decided that it should be an error if *none* of the conditions is true, so picking the location of a single one doesn't make much sense. And what about a file that is empty apart from "#error this header should not be used, use foobar.h instead"? You have to show the #error location in that case. Using the location of the #error as the location of the caret diagnostic seems like the only consistently useful behaviour.