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
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to