Quuxplusone added inline comments.
================
Comment at: clang/lib/Lex/Pragma.cpp:1996
AddPragmaHandler("clang", new PragmaSystemHeaderHandler());
+ AddPragmaHandler("clang", new PragmaIncludeInsteadHandler());
AddPragmaHandler("clang", new PragmaDebugHandler());
----------------
@rsmith wrote:
> I'm not in love with the design of this feature. Basing the accept / warn
> decision on whether the inclusion is in a system header seems fragile and
> doesn't seem to enforce the intended semantics of the warning (that you can
> only reach the implementation detail header through one of the named
> headers), and limits the utility of the feature to system headers. As an
> alternative, have you considered checking whether any of the headers named in
> the pragma are in the include stack, and warning if not?
@rsmith, I think you misunderstand part of the design goal here. You said "you
can only reach the implementation detail header through one of the named
headers" — this is true only for a maybe-surprising definition of "you." For
example, if the user-programmer's `"MyThing.hpp"` tries to include
`<__utility/move.h>` directly (or if IWYU wants to suggest how to include it),
we expect the tool to suggest that you must include `<utility>`, not
`<__utility/move.h>`. **However**, if the library's `<algorithm>` tries to
include `<__utility/move.h>` directly, **that's** totally fine and expected.
The entire point of these detail headers is to make sure that library headers
don't have to `#include <utility>` when all they need is one little piece of it.
So we do need **some** way to distinguish user-programmer headers like
`"MyThing.hpp"` from library headers like `<algorithm>`. At the moment this is
done by limiting the usefulness of the feature to just system headers, and
making every system header a "friend" of every other system header.
But one could imagine allowing a detail header to specify not only "here's how
my non-friends should get to me" (e.g. by including `<utility>`) but also
"here's a list of headers and/or directories which should be considered friends
of mine" (and which could then include me directly, e.g. `<algorithm>` or
`<__iterator/iter_move.h>`). We'd need a reliable syntax for that, though.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D106394/new/
https://reviews.llvm.org/D106394
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits