diff options
author | Arsen Arsenović <arsen@aarsen.me> | 2022-10-14 12:04:51 +0200 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-10-24 09:37:33 -0400 |
commit | f44575cb88727193386428e9ced3439e4f98f493 (patch) | |
tree | 676300379ab6560f5333503d820489ecab859ef0 /gcc/c/c-objc-common.cc | |
parent | 5bcd92d0d4029f3d1d2eacc0e2bff1685545b74f (diff) | |
download | gcc-f44575cb88727193386428e9ced3439e4f98f493.zip gcc-f44575cb88727193386428e9ced3439e4f98f493.tar.gz gcc-f44575cb88727193386428e9ced3439e4f98f493.tar.bz2 |
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.
Diffstat (limited to 'gcc/c/c-objc-common.cc')
-rw-r--r-- | gcc/c/c-objc-common.cc | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/c/c-objc-common.cc b/gcc/c/c-objc-common.cc index 70e10a9..b468091 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. */ |