public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Jason Merrill <jason@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r13-3457] c-family: Implicitly return zero from main even on freestanding
Date: Mon, 24 Oct 2022 13:45:47 +0000 (GMT)	[thread overview]
Message-ID: <20221024134547.6516B385840C@sourceware.org> (raw)

https://gcc.gnu.org/g:f44575cb88727193386428e9ced3439e4f98f493

commit r13-3457-gf44575cb88727193386428e9ced3439e4f98f493
Author: Arsen Arsenović <arsen@aarsen.me>
Date:   Fri Oct 14 12:04:51 2022 +0200

    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.

Diff:
---
 gcc/cp/cp-tree.h                                | 15 ++++++++++++---
 gcc/c/c-decl.cc                                 |  2 +-
 gcc/c/c-objc-common.cc                          |  9 ++++++---
 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(-)

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 60a25101049..2cca20be6c1 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/c/c-decl.cc b/gcc/c/c-decl.cc
index 80f6e912187..4746e310d2d 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -10542,7 +10542,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/decl.cc b/gcc/cp/decl.cc
index 85b892cddf0..bc085f8fcce 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -17852,7 +17852,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);
-}

                 reply	other threads:[~2022-10-24 13:45 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20221024134547.6516B385840C@sourceware.org \
    --to=jason@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /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).