From patchwork Sat Mar 2 06:45:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ken Matsui X-Patchwork-Id: 1907082 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=ppIqec0N; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TmwTV0sfrz23l2 for ; Sat, 2 Mar 2024 17:46:03 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D2438385841E for ; Sat, 2 Mar 2024 06:46:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D2438385841E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1709361960; bh=DjmvDm1OkfN9k9C9yF5WNQxY72irmxUy/WNilLzrSYg=; h=From:To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From; b=ppIqec0NT9sD6WHw82IFpHik2foAZJAC9ptlj2BSMU2wIlFERlHJBL/hqirIl7BSA jampfYvu9pszZnW5wDZ0xcXSbQ1QWq+WfswlceKu2v9TYO57KyLLz4NbEMQitQqh5I zsSjiVtFUjkOP5M27xo35vBlRGoPIpbNZjXUUJ5g= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-00641c01.pphosted.com (mx0a-00641c01.pphosted.com [205.220.165.146]) by sourceware.org (Postfix) with ESMTPS id 578153858C53; Sat, 2 Mar 2024 06:45:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 578153858C53 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=gcc.gnu.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 578153858C53 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=205.220.165.146 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709361934; cv=none; b=s3CgP1bwU+dkUcBlCeeeTKbMP/iekqDbt4iuRL71TYGGyVARJVOVpUTqiDX5Ja8dAyWbk5w+J8m8S2B/kckJhXWb5ua7eZBFqPZsWemcSNCdzc1YKSfwKcNcjEaaVOE0fS5tF5t0T0aT4nYJx2z4BY0lcyTBcps0wFJK2dPq6kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1709361934; c=relaxed/simple; bh=1894ui4FSRxs6kdEQpFv9TZDcSHQh82h3lyQ7QGe2eo=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=tUz7RzsCPQBIjTsYBssIVT++x3eCGNLE4R9VeRdg5wmaMvRsG6aCSPTyYxtj7hNjWXfiT0+Gk08LOak8YDeG85cwudW0rN+3Aa1n/pLOATSnSfTLySdjGhyvHNSc2BmuQJpzLZUq4ZELlu2lozTbYrwcECTpK0/leayAStkVg8s= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0247470.ppops.net [127.0.0.1]) by mx0a-00641c01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4226fi70023603; Sat, 2 Mar 2024 06:45:29 GMT Received: from mxout23.cac.washington.edu (mxout23.cac.washington.edu [140.142.32.140]) by mx0a-00641c01.pphosted.com (PPS) with ESMTPS id 3wkvqe8gnf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 02 Mar 2024 06:45:29 +0000 Received: from smtp.washington.edu (smtp.washington.edu [128.208.60.54]) by mxout23.cac.washington.edu (8.14.4+UW20.07/8.14.4+UW24.02) with ESMTP id 4226jMjB004774 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Mar 2024 22:45:22 -0800 X-Auth-Received: from kmatsui-ThinkPad-X1-Carbon-Gen-9.dhcp4.washington.edu ([10.154.74.128]) (authenticated authid=kmatsui) by smtp.washington.edu (8.16.1+UW21.10/8.14.4+UW24.02) with ESMTPSA id 4226jLmw029421 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 1 Mar 2024 22:45:21 -0800 X-UW-Orig-Sender: kmatsui@smtp.washington.edu From: Ken Matsui To: gcc-patches@gcc.gnu.org Cc: Ken Matsui Subject: [PATCH] gcc, libcpp: Add warning switch for "#pragma once in main file" [PR89808] Date: Fri, 1 Mar 2024 22:45:20 -0800 Message-ID: <20240302064520.2076664-1-kmatsui@gcc.gnu.org> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: ys9Ge8mzBR8dovWHjOMZKxDkSTSGvzXp X-Proofpoint-GUID: ys9Ge8mzBR8dovWHjOMZKxDkSTSGvzXp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-03-02_03,2024-03-01_03,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 malwarescore=0 suspectscore=0 mlxlogscore=999 clxscore=1034 phishscore=0 mlxscore=0 adultscore=0 impostorscore=0 bulkscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2311290000 definitions=main-2403020056 X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_NEUTRAL, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org 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-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. (enum cpp_warning_reason): Define CPP_W_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. * 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 --- gcc/c-family/c-opts.cc | 4 ++++ gcc/c-family/c.opt | 4 ++++ gcc/doc/invoke.texi | 10 ++++++++-- gcc/testsuite/g++.dg/Wpragma-once-outside-header.C | 6 ++++++ .../g++.dg/warn/Wno-pragma-once-outside-header.C | 5 +++++ .../g++.dg/warn/Wpragma-once-outside-header.C | 6 ++++++ libcpp/directives.cc | 6 ++++-- libcpp/include/cpplib.h | 6 +++++- libcpp/init.cc | 1 + 9 files changed, 43 insertions(+), 5 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..2868748a020 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -430,6 +430,10 @@ 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: + cpp_opts->cpp_warn_pragma_once_outside_header = value; + break; + 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..66b2c862344 --- /dev/null +++ b/gcc/testsuite/g++.dg/Wpragma-once-outside-header.C @@ -0,0 +1,6 @@ +/* { dg-do assemble } */ +/* { dg-options "-Werror=pragma-once-outside-header" } */ +/* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */ + +#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..324b0638c3f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wpragma-once-outside-header.C @@ -0,0 +1,6 @@ +// { dg-do assemble } +// { dg-options "-Werror=pragma-once-outside-header" } +// { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } + +#pragma once // { dg-error "#pragma once in main file" } +int main() {} diff --git a/libcpp/directives.cc b/libcpp/directives.cc index 479f8c716e8..cc8f110b66b 100644 --- a/libcpp/directives.cc +++ b/libcpp/directives.cc @@ -1588,8 +1588,10 @@ 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"); + if (CPP_OPTION (pfile, cpp_warn_pragma_once_outside_header) + && _cpp_in_main_source_file (pfile)) + cpp_warning (pfile, CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER, + "#pragma once in main file"); check_eol (pfile, false); _cpp_mark_file_once_only (pfile, pfile->buffer->file); diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index c62374d3192..7cf49fb2f74 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -583,6 +583,9 @@ struct cpp_options 2 if it should be a pedwarn. */ unsigned char cpp_warn_invalid_utf8; + /* True if libcpp should warn about #pragma once outside of a header. */ + bool cpp_warn_pragma_once_outside_header; + /* True if libcpp should warn about invalid forms of delimited or named escape sequences. */ bool cpp_warn_unicode; @@ -701,7 +704,8 @@ enum cpp_warning_reason { CPP_W_EXPANSION_TO_DEFINED, CPP_W_BIDIRECTIONAL, CPP_W_INVALID_UTF8, - CPP_W_UNICODE + CPP_W_UNICODE, + CPP_W_PRAGMA_ONCE_OUTSIDE_HEADER }; /* Callback for header lookup for HEADER, which is the name of a diff --git a/libcpp/init.cc b/libcpp/init.cc index 54fc9236d38..4be1afdb2c2 100644 --- a/libcpp/init.cc +++ b/libcpp/init.cc @@ -235,6 +235,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table, CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired; CPP_OPTION (pfile, cpp_warn_invalid_utf8) = 0; CPP_OPTION (pfile, cpp_warn_unicode) = 1; + CPP_OPTION (pfile, cpp_warn_pragma_once_outside_header) = 1; CPP_OPTION (pfile, cpp_input_charset_explicit) = 0; /* Default CPP arithmetic to something sensible for the host for the