From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout-p-101.mailbox.org (mout-p-101.mailbox.org [80.241.56.151]) by sourceware.org (Postfix) with ESMTPS id C8116385800A; Fri, 14 Oct 2022 10:04:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C8116385800A Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=aarsen.me Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=aarsen.me Received: from smtp2.mailbox.org (smtp2.mailbox.org [IPv6:2001:67c:2050:b231:465::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4Mphnx5ph0z9sQr; Fri, 14 Oct 2022 12:04:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aarsen.me; s=MBO0001; t=1665741893; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=CY5Cce4N4nUnoFp2RZ2kzgAf7/ossnc3jy7Mcm1dVAA=; b=PjlCEvoYO6wjsojpFMerP7yKKek++6J4U+q9QEU7xjsDuDSusjtHC9iRAslwz4QcQoOueQ 17cgMzV70WLgGuAmEbGCeyhAAeKoePzvvc6SlHEMSuYEa50mBPulCcQ+o/b8VyNbsXPkqM 5M2fXLD7ffcHPt0NfO2qJmd2Fru0HRv+Rm3SmD3ecx9uyIxNzWOdjsBmNCTS3TlQYUPncZ Uk6CfoyCzhTdnkFGxrx5WAz9AnkQp94bgw9gRHAJ4GYj+IGM5PYVofpiVNzGd85YWhKDwI 7oFbZNjBghN3GwtGQ8yR3n+ErUPsT08ZB5NmEx3D5+DfSaZsErLdPwAf7xpKEg== From: Arsen =?utf-8?B?QXJzZW5vdmnEhw==?= To: Jonathan Wakely , gcc-patches@gcc.gnu.org Cc: "gcc@gcc.gnu.org" , Jakub Jelinek , "Joseph S. Myers" , Jason Merrill Subject: Re: Handling of main() function for freestanding Date: Fri, 14 Oct 2022 12:04:51 +0200 Message-ID: <1860348.8SKhNGa0Zi@bstg> In-Reply-To: <5b636835-20af-2372-75d2-92e31a3393ed@redhat.com> References: <4964626.imyG0pze7u@bstg> <5b636835-20af-2372-75d2-92e31a3393ed@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart10943511.Qt2dRat77C"; micalg="pgp-sha512"; protocol="application/pgp-signature" X-Rspamd-Queue-Id: 4Mphnx5ph0z9sQr X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_INFOUSMEBIZ,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --nextPart10943511.Qt2dRat77C Content-Type: multipart/mixed; boundary="nextPart6710965.alnseIVU6O"; protected-headers="v1" Content-Transfer-Encoding: 7Bit From: Arsen =?utf-8?B?QXJzZW5vdmnEhw==?= To: Jonathan Wakely , gcc-patches@gcc.gnu.org Subject: Re: Handling of main() function for freestanding Date: Fri, 14 Oct 2022 12:04:23 +0200 Message-ID: <1860348.8SKhNGa0Zi@bstg> In-Reply-To: <5b636835-20af-2372-75d2-92e31a3393ed@redhat.com> MIME-Version: 1.0 This is a multi-part message in MIME format. --nextPart6710965.alnseIVU6O Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On Thursday, 13 October 2022 23:16:02 CEST Jason Merrill wrote: > I liked in the previous version that you checked the return type of > main when !flag_hosted, here and in c_missing_noreturn_ok_p. Let's > bring that back. Ah, right; I forgot about that. What do you think of this? =20 Thanks, =2D-=20 Arsen Arsenovi=C4=87 --nextPart6710965.alnseIVU6O Content-Disposition: attachment; filename="v4-0001-c-family-Implicitly-return-zero-from-main-even-on.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="v4-0001-c-family-Implicitly-return-zero-from-main-even-on.patch" >From dfc1677d1dcfa1b3b963fca8ea5eb8878c4e63d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arsen=20Arsenovi=C4=87?= Date: Thu, 13 Oct 2022 21:46:30 +0200 Subject: [PATCH v4] c-family: Implicitly return zero from main even on freestanding ... unless marked noreturn. This should not get in anyone's way, but should permit the use of main() in freestanding more easily, especially for writing test cases that should work both in freestanding and hosted modes. gcc/c/ChangeLog: * c-decl.cc (finish_function): Ignore hosted when deciding whether to implicitly return zero, but check noreturn. * c-objc-common.cc (c_missing_noreturn_ok_p): Loosen the requirements to just MAIN_NAME_P when hosted, or `int main' otherwise. gcc/cp/ChangeLog: * cp-tree.h (DECL_MAIN_P): Move most logic, besides the hosted check, from here... (DECL_MAIN_ANY_P): ... to here, so that it can be reused ... (DECL_MAIN_FREESTANDING_P): ... here, with an additional constraint on (hosted OR return type == int) * decl.cc (finish_function): Use DECL_MAIN_FREESTANDING_P instead of DECL_MAIN_P, to loosen the hosted requirement, but check noreturn, before adding implicit returns. gcc/testsuite/ChangeLog: * gcc.dg/noreturn-4.c: Removed. * g++.dg/freestanding-main.C: New test. * g++.dg/freestanding-nonint-main.C: New test. * gcc.dg/freestanding-main.c: New test. * gcc.dg/freestanding-nonint-main.c: New test. --- gcc/c/c-decl.cc | 2 +- gcc/c/c-objc-common.cc | 9 ++++++--- gcc/cp/cp-tree.h | 15 ++++++++++++--- gcc/cp/decl.cc | 3 ++- gcc/testsuite/g++.dg/freestanding-main.C | 5 +++++ gcc/testsuite/g++.dg/freestanding-nonint-main.C | 5 +++++ gcc/testsuite/gcc.dg/freestanding-main.c | 5 +++++ gcc/testsuite/gcc.dg/freestanding-nonint-main.c | 5 +++++ gcc/testsuite/gcc.dg/noreturn-4.c | 10 ---------- 9 files changed, 41 insertions(+), 18 deletions(-) create mode 100644 gcc/testsuite/g++.dg/freestanding-main.C create mode 100644 gcc/testsuite/g++.dg/freestanding-nonint-main.C create mode 100644 gcc/testsuite/gcc.dg/freestanding-main.c create mode 100644 gcc/testsuite/gcc.dg/freestanding-nonint-main.c delete mode 100644 gcc/testsuite/gcc.dg/noreturn-4.c diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 193e268f04e..8c655590558 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -10442,7 +10442,7 @@ finish_function (location_t end_loc) if (DECL_RESULT (fndecl) && DECL_RESULT (fndecl) != error_mark_node) DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; - if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted + if (MAIN_NAME_P (DECL_NAME (fndecl)) && !TREE_THIS_VOLATILE (fndecl) && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl))) == integer_type_node && flag_isoc99) { diff --git a/gcc/c/c-objc-common.cc b/gcc/c/c-objc-common.cc index 70e10a98e33..b4680912547 100644 --- a/gcc/c/c-objc-common.cc +++ b/gcc/c/c-objc-common.cc @@ -37,9 +37,12 @@ static bool c_tree_printer (pretty_printer *, text_info *, const char *, bool c_missing_noreturn_ok_p (tree decl) { - /* A missing noreturn is not ok for freestanding implementations and - ok for the `main' function in hosted implementations. */ - return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)); + /* A missing noreturn is ok for the `main' function. */ + if (!MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl))) + return false; + + return flag_hosted + || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl))) == integer_type_node; } /* Called from check_global_declaration. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 3b67be651b9..33529fa8093 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -772,11 +772,20 @@ typedef struct ptrmem_cst * ptrmem_cst_t; /* Returns nonzero iff NODE is a declaration for the global function `main'. */ -#define DECL_MAIN_P(NODE) \ +#define DECL_MAIN_ANY_P(NODE) \ (DECL_EXTERN_C_FUNCTION_P (NODE) \ && DECL_NAME (NODE) != NULL_TREE \ - && MAIN_NAME_P (DECL_NAME (NODE)) \ - && flag_hosted) + && MAIN_NAME_P (DECL_NAME (NODE))) + +/* Nonzero iff NODE is a declaration for `int main', or we are hosted. */ +#define DECL_MAIN_FREESTANDING_P(NODE) \ + (DECL_MAIN_ANY_P(NODE) \ + && (flag_hosted \ + || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (NODE))) \ + == integer_type_node)) + +/* Nonzero iff NODE is a declaration for `main', and we are hosted. */ +#define DECL_MAIN_P(NODE) (DECL_MAIN_ANY_P(NODE) && flag_hosted) /* Lookup walker marking. */ #define LOOKUP_SEEN_P(NODE) TREE_VISITED (NODE) diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 82eb0c2f22a..cfc8cd5afd7 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -17854,7 +17854,8 @@ finish_function (bool inline_p) if (!DECL_CLONED_FUNCTION_P (fndecl)) { /* Make it so that `main' always returns 0 by default. */ - if (DECL_MAIN_P (current_function_decl)) + if (DECL_MAIN_FREESTANDING_P (current_function_decl) + && !TREE_THIS_VOLATILE (current_function_decl)) finish_return_stmt (integer_zero_node); if (use_eh_spec_block (current_function_decl)) diff --git a/gcc/testsuite/g++.dg/freestanding-main.C b/gcc/testsuite/g++.dg/freestanding-main.C new file mode 100644 index 00000000000..3718cc4508e --- /dev/null +++ b/gcc/testsuite/g++.dg/freestanding-main.C @@ -0,0 +1,5 @@ +/* Make sure we don't get a missing return warning on freestanding. */ +/* { dg-do compile } */ +/* { dg-options "-ffreestanding -Wreturn-type" } */ + +int main() {} diff --git a/gcc/testsuite/g++.dg/freestanding-nonint-main.C b/gcc/testsuite/g++.dg/freestanding-nonint-main.C new file mode 100644 index 00000000000..a8571cc6f0b --- /dev/null +++ b/gcc/testsuite/g++.dg/freestanding-nonint-main.C @@ -0,0 +1,5 @@ +/* Check that we get the right warning for nonint main in freestanding. */ +/* { dg-do compile } */ +/* { dg-options "-ffreestanding -Wreturn-type" } */ + +const char *main() {} /* { dg-warning "-Wreturn-type" } */ diff --git a/gcc/testsuite/gcc.dg/freestanding-main.c b/gcc/testsuite/gcc.dg/freestanding-main.c new file mode 100644 index 00000000000..3718cc4508e --- /dev/null +++ b/gcc/testsuite/gcc.dg/freestanding-main.c @@ -0,0 +1,5 @@ +/* Make sure we don't get a missing return warning on freestanding. */ +/* { dg-do compile } */ +/* { dg-options "-ffreestanding -Wreturn-type" } */ + +int main() {} diff --git a/gcc/testsuite/gcc.dg/freestanding-nonint-main.c b/gcc/testsuite/gcc.dg/freestanding-nonint-main.c new file mode 100644 index 00000000000..d8393346b09 --- /dev/null +++ b/gcc/testsuite/gcc.dg/freestanding-nonint-main.c @@ -0,0 +1,5 @@ +/* Check that we get the right warning for nonint main in freestanding. */ +/* { dg-do compile } */ +/* { dg-options "-ffreestanding -Wreturn-type" } */ + +const char *main(void) {} /* { dg-warning "-Wreturn-type" } */ diff --git a/gcc/testsuite/gcc.dg/noreturn-4.c b/gcc/testsuite/gcc.dg/noreturn-4.c deleted file mode 100644 index 6fe144754d0..00000000000 --- a/gcc/testsuite/gcc.dg/noreturn-4.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Check for "noreturn" warning in main. */ -/* { dg-do compile } */ -/* { dg-options "-O2 -Wmissing-noreturn -ffreestanding" } */ -extern void exit (int) __attribute__ ((__noreturn__)); - -int -main (void) /* { dg-warning "function might be candidate for attribute 'noreturn'" "warn for main" } */ -{ - exit (0); -} -- 2.38.0 --nextPart6710965.alnseIVU6O-- --nextPart10943511.Qt2dRat77C Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part. Content-Transfer-Encoding: 7Bit -----BEGIN PGP SIGNATURE----- iNUEABYKAH0WIQT+4rPRE/wAoxYtYGFSwpQwHqLEkwUCY0k0J18UgAAAAAAuAChp c3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9yc2VtYW4ubmV0RkVF MkIzRDExM0ZDMDBBMzE2MkQ2MDYxNTJDMjk0MzAxRUEyQzQ5MwAKCRBSwpQwHqLE k/mhAP9CzSi9ZhEdLFxbwFQ5avT1pV96SsfCYIjIh85lgkvmbQEAutNjLj2t3gyP xelT3jjFZSutg/K7tEQKqXYVPuelWwE= =135C -----END PGP SIGNATURE----- --nextPart10943511.Qt2dRat77C--