On Thu, 2024-06-13 at 07:31 -0700, Ken Matsui wrote: > This patch adds a warning switch for "#pragma once in main file". > The > warning option name is Wpragma-once-outside-header, which is the same > as Clang. > > PR preprocessor/89808 > > gcc/c-family/ChangeLog: > > * c.opt (Wpragma_once_outside_header): Define new option. > > gcc/ChangeLog: > > * doc/invoke.texi (Warning Options): Document > -Wno-pragma-once-outside-header. > > libcpp/ChangeLog: > > * include/cpplib.h (struct cpp_options): Define > cpp_warn_pragma_once_outside_header. > (cpp_warning_reason): Define > CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER. > * directives.cc (do_pragma_once): Use > cpp_warn_pragma_once_outside_header and > CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER. > * init.cc (cpp_create_reader): Handle > cpp_warn_pragma_once_outside_header. > > gcc/testsuite/ChangeLog: > > * g++.dg/warn/Wno-pragma-once-outside-header.C: New test. > * g++.dg/warn/Wpragma-once-outside-header.C: New test. > > Signed-off-by: Ken Matsui <kmat...@gcc.gnu.org>
[...snip...] Thanks for the updated patch. > @@ -7983,6 +7983,12 @@ Do not warn about misuses of pragmas, such as > incorrect parameters, > invalid syntax, or conflicts between pragmas. See also > @option{-Wunknown-pragmas}. > > +@opindex Wno-pragma-once-outside-header > +@opindex Wpragma-once-outside-header > +@item -Wno-pragma-once-outside-header > +Do not warn when @code{#pragma once} is used in a file that is not a > header > +file, such as a main file. > + > @opindex Wno-prio-ctor-dtor > @opindex Wprio-ctor-dtor > @item -Wno-prio-ctor-dtor Please run "make html && make regenerate-opt-urls" so that the diagnostic gets a documentation URL. Sorry that you have to do this manually (it's to avoid complicating the build dependencies for someone just building gcc). [...snip...] > diff --git a/libcpp/directives.cc b/libcpp/directives.cc > index 479f8c716e8..68f47104dea 100644 > --- a/libcpp/directives.cc > +++ b/libcpp/directives.cc > @@ -1588,8 +1588,12 @@ do_pragma (cpp_reader *pfile) > static void > do_pragma_once (cpp_reader *pfile) > { > - if (_cpp_in_main_source_file (pfile)) > - cpp_error (pfile, CPP_DL_WARNING, "#pragma once in main file"); > + const unsigned char warn_level = > + CPP_OPTION (pfile, cpp_warn_pragma_once_outside_header); > + > + if (warn_level && _cpp_in_main_source_file (pfile)) > + cpp_warning (pfile, CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER, > + "#pragma once in main file"); Please put the "#pragma once" in the message in quotes, such as via: cpp_warning (pfile, CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER, "%<pragma once%> in main file"); or via: cpp_warning (pfile, CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER, "%qs in main file", "pragma once"); Although it's a minor style nit, I'm working on patches to automatically add URLs to GCC's documentation for certain quoted strings on sufficiently capable terminals (I've done command-line options, I'm working on attributes, and I hope to eventually do pragmas). Dave