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

Reply via email to