https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98306
Bug ID: 98306 Summary: invalid use of incomplete type 'struct grammar' Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: slyfox at gcc dot gnu.org Target Milestone: --- Noticed error-looking warning when was reducing unrelated boost ICE. Minimal reproducer: // $ cat bug.cpp extern struct grammar *target_grammar; template <typename T> void define(void) { target_grammar->derived(); } $ g++-11.0.0 -c bug.cpp; echo $? bug.cpp: In function 'void define()': bug.cpp:3:57: warning: invalid use of incomplete type 'struct grammar' 3 | template <typename T> void define(void) { target_grammar->derived(); } | ^~ bug.cpp:1:15: note: forward declaration of 'struct grammar' 1 | extern struct grammar *target_grammar; | ^~~~~~~ 0 $ clang++ -c bug.cpp; echo $? clang++ bug.cpp:3:57: error: member access into incomplete type 'struct grammar' template <typename T> void define(void) { target_grammar->derived(); } ^ bug.cpp:1:15: note: forward declaration of 'grammar' extern struct grammar *target_grammar; ^ 1 error generated. 1 I read the diagnostic with "invalid use" as clearly incorrect code. Should g++ error out instead of generating a warning?