Added docs and tests for -fexceptions behaviour, matching
[[gnu::cleanup]] and clang's _Defer behaviour with the flag on.
Arsen Arsenović (1):
gcc/testsuite: support specifying a language for additional sources
navi (3):
c: handle expression nodes in push_cleanup
c: introduce jump barriers for statement expressions
c: implement defer
gcc/Makefile.in | 1 +
gcc/c-family/c-common.cc | 1 +
gcc/c-family/c-common.h | 1 +
gcc/c-family/c-cppbuiltin.cc | 3 +
gcc/c/c-decl.cc | 190 +++++++++++++++--------
gcc/c/c-parser.cc | 39 +++++
gcc/c/c-tree.h | 8 +-
gcc/c/c-typeck.cc | 60 ++++++--
gcc/doc/extend.texi | 15 ++
gcc/doc/sourcebuild.texi | 7 +-
gcc/ginclude/stddefer.h | 38 +++++
gcc/testsuite/g++.dg/defer-aux.c | 12 ++
gcc/testsuite/g++.dg/defer.C | 29 ++++
gcc/testsuite/gcc.dg/defer-1.c | 256 +++++++++++++++++++++++++++++++
gcc/testsuite/gcc.dg/defer-2.c | 78 ++++++++++
gcc/testsuite/gcc.dg/defer-3.c | 17 ++
gcc/testsuite/gcc.dg/defer-4.c | 8 +
gcc/testsuite/lib/gcc-defs.exp | 140 +++++++++++++----
gcc/testsuite/lib/gcc-dg.exp | 4 +-
19 files changed, 804 insertions(+), 103 deletions(-)
create mode 100644 gcc/ginclude/stddefer.h
create mode 100644 gcc/testsuite/g++.dg/defer-aux.c
create mode 100644 gcc/testsuite/g++.dg/defer.C
create mode 100644 gcc/testsuite/gcc.dg/defer-1.c
create mode 100644 gcc/testsuite/gcc.dg/defer-2.c
create mode 100644 gcc/testsuite/gcc.dg/defer-3.c
create mode 100644 gcc/testsuite/gcc.dg/defer-4.c
Range-diff against v7:
1: 3aecc7ff96a ! 1: fd9d353ba29 c: handle expression nodes in push_cleanup
@@
## Metadata ##
-Author: Anna (navi) Figueiredo Gomes <[email protected]>
+Author: navi <[email protected]>
## Commit message ##
c: handle expression nodes in push_cleanup
@@ Commit message
* c-typeck.cc (push_cleanup): Handle EXPR_P nodes.
- Signed-off-by: Anna (navi) Figueiredo Gomes <[email protected]>
+ Signed-off-by: navi <[email protected]>
## gcc/c/c-typeck.cc ##
@@ gcc/c/c-typeck.cc: c_end_compound_stmt (location_t loc, tree stmt, bool
do_scope)
2: 3383d769fb2 ! 2: bdec86a2ad3 c: introduce jump barriers for statement
expressions
@@
## Metadata ##
-Author: Anna (navi) Figueiredo Gomes <[email protected]>
+Author: navi <[email protected]>
## Commit message ##
c: introduce jump barriers for statement expressions
@@ Commit message
(c_release_switch_bindings): Likewise.
(c_check_switch_jump_warnings): Likewise.
- Signed-off-by: Anna (navi) Figueiredo Gomes <[email protected]>
+ Signed-off-by: navi <[email protected]>
## gcc/c/c-decl.cc ##
@@ gcc/c/c-decl.cc: c_tree_size (enum tree_code code)
-: ----------- > 3: f326f70ee14 gcc/testsuite: support specifying a language
for additional sources
3: c43bf8c8fce ! 4: 79111f97874 c: implement defer
@@
## Metadata ##
-Author: Anna (navi) Figueiredo Gomes <[email protected]>
+Author: navi <[email protected]>
## Commit message ##
c: implement defer
@@ Commit message
* gcc.dg/defer-3.c: New test.
* gcc.dg/defer-4.c: New test.
- Signed-off-by: Anna (navi) Figueiredo Gomes <[email protected]>
+ Signed-off-by: navi <[email protected]>
## gcc/Makefile.in ##
@@ gcc/Makefile.in: USER_H = $(srcdir)/ginclude/float.h \
@@ gcc/c/c-typeck.cc: c_finish_stmt_expr (location_t loc, tree body)
and popping new statement lists from the tree. */
+ ## gcc/doc/extend.texi ##
+@@ gcc/doc/extend.texi: These identifiers are variables, not preprocessor
macros, and may not
+ be used to initialize @code{char} arrays or be concatenated with string
+ literals.
+
++@node Defer
++@subsection Support for the @code{_Defer} keyword
++@cindex defer
++@cindex @code{_Defer} keyword
++@item _Defer @var{defeered_block}
++
++The technical specification ISO/DIS TS 25755 added @code{_Defer} as a C
++language keyword for deferred execution of statements on scope exit. As an
++extension, GNU C recognizes @code{_Defer} in all C versions.
++
++If @option{-fexceptions} is enabled, then all @var{defeered_block}s
++are run during the stack unwinding that happens during the processing
++of the exception. Note that the @code{_Defer} does not allow the
++exception to be caught, only to perform an action.
++
+ @node Semantic Extensions
+ @section Extensions to C Semantics
+
+
## gcc/ginclude/stddefer.h (new) ##
@@
+/* Copyright (C) 1998-2025 Free Software Foundation, Inc.
@@ gcc/ginclude/stddefer.h (new)
+
+#endif /* stddefer.h */
+ ## gcc/testsuite/g++.dg/defer-aux.c (new) ##
+@@
++/* { dg-options "-fexceptions" } */
++
++extern void a ();
++extern int c;
++
++void b ()
++{
++ c += 1;
++ _Defer c += 1;
++ a ();
++ c += 1;
++}
+
+ ## gcc/testsuite/g++.dg/defer.C (new) ##
+@@
++/* { dg-do run } */
++/* { dg-additional-options "-fexceptions" } */
++/* { dg-additional-sources defer-aux.c { lang c } } */
++
++extern "C" {
++ extern void b ();
++
++ int c = 0;
++
++ void a ()
++ {
++ throw 1;
++ }
++}
++
++int main ()
++{
++ try
++ {
++ b ();
++ }
++ catch (int e)
++ {
++ if (c != 2)
++ __builtin_abort ();
++ return 0;
++ }
++ __builtin_abort ();
++}
+
## gcc/testsuite/gcc.dg/defer-1.c (new) ##
@@
+/* { dg-do run } */
--
2.55.0