Bug 2045069
| Summary: | cpp stops when finding a missing include | |||
|---|---|---|---|---|
| Product: | Red Hat Enterprise Linux 7 | Reporter: | Paulo Andrade <pandrade> | |
| Component: | gcc | Assignee: | Marek Polacek <mpolacek> | |
| Status: | CLOSED NOTABUG | QA Contact: | Alexandra Petlanová Hájková <ahajkova> | |
| Severity: | medium | Docs Contact: | ||
| Priority: | unspecified | |||
| Version: | 7.9 | CC: | dmalcolm, fweimer, jakub, ohudlick, sipoyare | |
| Target Milestone: | rc | |||
| Target Release: | --- | |||
| Hardware: | All | |||
| OS: | Linux | |||
| Whiteboard: | ||||
| Fixed In Version: | Doc Type: | If docs needed, set a value | ||
| Doc Text: | Story Points: | --- | ||
| Clone Of: | ||||
| : | 2045071 (view as bug list) | Environment: | ||
| Last Closed: | 2022-01-25 17:13:53 UTC | Type: | Bug | |
| Regression: | --- | Mount Type: | --- | |
| Documentation: | --- | CRM: | ||
| Verified Versions: | Category: | --- | ||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | ||
| Cloudforms Team: | --- | Target Upstream Version: | ||
| Embargoed: | ||||
| Bug Depends On: | ||||
| Bug Blocks: | 2045071 | |||
This was an intentional change to avoid printing too many errors if there's a header missing, as discussed in https://gcc.gnu.org/PR15638. I'm entirely unwilling to change this in RHEL, sorry. As a workaround, I suppose you could use $ DEPENDENCIES_OUTPUT=/dev/null gcc test.c -nostdinc -I. -Werror Thanks for the PR link and reduced workaround that basically provides the same behavior as rhel6. |
Reproducer: """ $ cat test.c #include <inc1.h> #include <inc2.h> #include <inc3.h> main() { } $ cat inc1.h #include <limits.h> $ cat inc2.h #include <string.h> $ cat inc3.h #include <stdio.h> $ cpp -I. -nostdinc test.c # 1 "test.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "testprogram.c" # 1 "./inc1.h" 1 In file included from test.c:1:0: ./inc1.h:1:19: fatal error: limits.h: No such file or directory #include <limits.h> ^ compilation terminated. """ On rhel6 it did list all missing includes, that is, would print something like: """ # 1 "test.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "test.c" # 1 "./inc1.h" 1 In file included from test.c:1:0: ./inc1.h:1:19: error: limits.h: No such file or directory [enabled by default] #include <limits.h> ^ # 2 "test.c" 2 # 1 "./inc2.h" 1 In file included from test.c:2:0: ./inc2.h:1:19: error: string.h: No such file or directory [enabled by default] #include <string.h> ^ # 3 "test.c" 2 # 1 "./inc3.h" 1 In file included from test.c:3:0: ./inc3.h:1:18: error: stdio.h: No such file or directory [enabled by default] #include <stdio.h> ^ # 4 "testprogram.c" 2 main() { } """ It appears the previous behavior should happen if one also pass -Wno-fatal-errors to cpp command line. Note that on rhel7 and newer it prints "fatal error: ...", and on rhel6 it prints "error: ...". A possible workaround is to run as: $ ( export DEPENDENCIES_OUTPUT=1; export SUNPRO_DEPENDENCIES=1; cpp -I. -nostdinc test.c ) what will cause cpp related flags to be set to follow a code path where it will not cause a fatal error, but print "warning: ..." and list all missing include files. The current behavior is likely the expected, as when not including a file, any new error/warning messages are likely bogus as it could be interpreted very differently if the missing include was loaded. But user relies on previous behavior.