public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: Ken Matsui <kmatsui@cs.washington.edu>, gcc-patches@gcc.gnu.org
Subject: Re: [PATCH v2] gcc, libcpp: Add warning switch for "#pragma once in main file" [PR89808]
Date: Tue, 4 Jun 2024 10:54:35 -0400	[thread overview]
Message-ID: <91b2b377-96c6-44e3-b218-cc8ea8f0de92@redhat.com> (raw)
In-Reply-To: <CAML+3pVhkW0srOim9MPurmrEVUo8yb=QU3i=2F6ioWG_GinzSw@mail.gmail.com>

On 3/14/24 04:01, Ken Matsui wrote:
> On Sat, Mar 2, 2024 at 5:04 AM Ken Matsui <kmatsui@gcc.gnu.org> 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.
> 
> Ping.
> 
>>
>>          PR preprocessor/89808
>>
>> gcc/c-family/ChangeLog:
>>
>>          * c-opts.cc (c_common_handle_option): Handle
>>          OPT_Wpragma_once_outside_header.
>>          * 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.
>>          * directives.cc (do_pragma_once): Use
>>          cpp_warn_pragma_once_outside_header.
>>          * init.cc (cpp_create_reader): Handle
>>          cpp_warn_pragma_once_outside_header.
>>
>> gcc/testsuite/ChangeLog:
>>
>>          * g++.dg/Wpragma-once-outside-header.C: New test.

Please drop this file, keeping the duplicate in the warn subdirectory.

>>          * 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 <kmatsui@gcc.gnu.org>
>> ---
>>   gcc/c-family/c-opts.cc                                 |  9 +++++++++
>>   gcc/c-family/c.opt                                     |  4 ++++
>>   gcc/doc/invoke.texi                                    | 10 ++++++++--
>>   gcc/testsuite/g++.dg/Wpragma-once-outside-header.C     |  5 +++++
>>   .../g++.dg/warn/Wno-pragma-once-outside-header.C       |  5 +++++
>>   .../g++.dg/warn/Wpragma-once-outside-header.C          |  5 +++++
>>   libcpp/directives.cc                                   |  8 ++++++--
>>   libcpp/include/cpplib.h                                |  4 ++++
>>   libcpp/init.cc                                         |  1 +
>>   9 files changed, 47 insertions(+), 4 deletions(-)
>>   create mode 100644 gcc/testsuite/g++.dg/Wpragma-once-outside-header.C
>>   create mode 100644 gcc/testsuite/g++.dg/warn/Wno-pragma-once-outside-header.C
>>   create mode 100644 gcc/testsuite/g++.dg/warn/Wpragma-once-outside-header.C
>>
>> diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
>> index be3058dca63..4edd8c6c515 100644
>> --- a/gcc/c-family/c-opts.cc
>> +++ b/gcc/c-family/c-opts.cc
>> @@ -430,6 +430,15 @@ c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
>>         cpp_opts->warn_num_sign_change = value;
>>         break;
>>
>> +    case OPT_Wpragma_once_outside_header:
>> +      if (value == 0)
>> +       cpp_opts->cpp_warn_pragma_once_outside_header = 0;
>> +      else if (kind == DK_ERROR)
>> +       cpp_opts->cpp_warn_pragma_once_outside_header = 2;
>> +      else
>> +       cpp_opts->cpp_warn_pragma_once_outside_header = 1;
>> +      break;

Rather than encode the -Werror this way...

>>       case OPT_Wunknown_pragmas:
>>         /* Set to greater than 1, so that even unknown pragmas in
>>           system headers will be warned about.  */
>> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
>> index b7a4a1a68e3..6841a5a5e81 100644
>> --- a/gcc/c-family/c.opt
>> +++ b/gcc/c-family/c.opt
>> @@ -1180,6 +1180,10 @@ Wpragmas
>>   C ObjC C++ ObjC++ Var(warn_pragmas) Init(1) Warning
>>   Warn about misuses of pragmas.
>>
>> +Wpragma-once-outside-header
>> +C ObjC C++ ObjC++ Var(warn_pragma_once_outside_header) Init(1) Warning
>> +Warn about #pragma once outside of a header.
>> +
>>   Wprio-ctor-dtor
>>   C ObjC C++ ObjC++ Var(warn_prio_ctor_dtor) Init(1) Warning
>>   Warn if constructor or destructors with priorities from 0 to 100 are used.
>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>> index bdf05be387d..eeb8954bcdf 100644
>> --- a/gcc/doc/invoke.texi
>> +++ b/gcc/doc/invoke.texi
>> @@ -391,8 +391,8 @@ Objective-C and Objective-C++ Dialects}.
>>   -Wpacked  -Wno-packed-bitfield-compat  -Wpacked-not-aligned  -Wpadded
>>   -Wparentheses  -Wno-pedantic-ms-format
>>   -Wpointer-arith  -Wno-pointer-compare  -Wno-pointer-to-int-cast
>> --Wno-pragmas  -Wno-prio-ctor-dtor  -Wredundant-decls
>> --Wrestrict  -Wno-return-local-addr  -Wreturn-type
>> +-Wno-pragmas  -Wno-pragma-once-outside-header  -Wno-prio-ctor-dtor
>> +-Wredundant-decls  -Wrestrict  -Wno-return-local-addr  -Wreturn-type
>>   -Wno-scalar-storage-order  -Wsequence-point
>>   -Wshadow  -Wshadow=global  -Wshadow=local  -Wshadow=compatible-local
>>   -Wno-shadow-ivar
>> @@ -7955,6 +7955,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
>> diff --git a/gcc/testsuite/g++.dg/Wpragma-once-outside-header.C b/gcc/testsuite/g++.dg/Wpragma-once-outside-header.C
>> new file mode 100644
>> index 00000000000..678bd4e7626
>> --- /dev/null
>> +++ b/gcc/testsuite/g++.dg/Wpragma-once-outside-header.C
>> @@ -0,0 +1,5 @@
>> +/* { dg-do assemble  } */
>> +/* { dg-options "-Werror=pragma-once-outside-header" } */
>> +
>> +#pragma once  // { dg-error "#pragma once in main file" }
>> +int main() {}
>> diff --git a/gcc/testsuite/g++.dg/warn/Wno-pragma-once-outside-header.C b/gcc/testsuite/g++.dg/warn/Wno-pragma-once-outside-header.C
>> new file mode 100644
>> index 00000000000..b5be4d25a9d
>> --- /dev/null
>> +++ b/gcc/testsuite/g++.dg/warn/Wno-pragma-once-outside-header.C
>> @@ -0,0 +1,5 @@
>> +// { dg-do assemble  }
>> +// { dg-options "-Wno-pragma-once-outside-header" }
>> +
>> +#pragma once
>> +int main() {}
>> diff --git a/gcc/testsuite/g++.dg/warn/Wpragma-once-outside-header.C b/gcc/testsuite/g++.dg/warn/Wpragma-once-outside-header.C
>> new file mode 100644
>> index 00000000000..ae958d3beb8
>> --- /dev/null
>> +++ b/gcc/testsuite/g++.dg/warn/Wpragma-once-outside-header.C
>> @@ -0,0 +1,5 @@
>> +// { dg-do assemble  }
>> +// { dg-options "-Werror=pragma-once-outside-header" }
>> +
>> +#pragma once  // { dg-error "#pragma once in main file" }
>> +int main() {}
>> diff --git a/libcpp/directives.cc b/libcpp/directives.cc
>> index 479f8c716e8..b6121a459f8 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_error (pfile, (warn_level == 1 ? CPP_DL_WARNING : CPP_DL_ERROR),
>> +              "#pragma once in main file");

...it would seem better to use cpp_warning and add a cpp_warning_reason 
for this diagnostic, so the normal -Werror handling (including #pragma 
GCC diagnostic) takes care of it?

Jason


  parent reply	other threads:[~2024-06-04 14:54 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-02  6:45 [PATCH] " Ken Matsui
2024-03-02 13:04 ` [PATCH v2] " Ken Matsui
2024-03-14  8:01   ` Ken Matsui
2024-05-06 13:24     ` Ken Matsui
2024-06-04 14:54     ` Jason Merrill [this message]
2024-06-13 14:31       ` Ken Matsui
2024-06-13 14:31   ` [PATCH v3] " Ken Matsui
2024-06-13 14:42     ` David Malcolm
2024-06-13 14:44     ` Jason Merrill
2024-06-16  0:52       ` Ken Matsui
2024-06-16  0:59     ` [PATCH v4] " Ken Matsui
2024-06-16  5:30       ` [PATCH v5] " Ken Matsui

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=91b2b377-96c6-44e3-b218-cc8ea8f0de92@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=kmatsui@cs.washington.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).