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

Reply via email to