Consider the following set of files:
a.cc: #include "a.h" a.h: #ifndef A_H #define A_H #include "b.h" #include "c.h" // This gets "skipped". #endif b.h: #ifndef B_H #define B_H #include "c.h" #endif c.h: #ifndef C_H #define C_H void c(); #endif
And the output of the -H option:
$ clang -c -H a.cc . ./a.h .. ./b.h ... ./c.h
Note that the include of c.h in a.h is not shown in the output. (GCC does the same.) This is because of the include guard optimization: clang knows c.h is covered by an include guard which is already defined, so when it sees the include in a.h, it skips it. The same would have happened if #pragma once were used instead of include guards.
However, a.h *does* include c.h, and it may be useful to show that in the -H output. This patch adds a flag for doing that.