_Noreturn.h 1.83 KB
Newer Older
Paul Eggert's avatar
Paul Eggert committed
1
/* A C macro for declaring that a function does not return.
2
   Copyright (C) 2011-2020 Free Software Foundation, Inc.
Paul Eggert's avatar
Paul Eggert committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16

   This program is free software: you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

Paul Eggert's avatar
Paul Eggert committed
17
#ifndef _Noreturn
Paul Eggert's avatar
Paul Eggert committed
18 19
# if (defined __cplusplus \
      && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
Paul Eggert's avatar
Paul Eggert committed
20 21 22 23 24 25 26 27
          || (defined _MSC_VER && 1900 <= _MSC_VER)) \
      && 0)
    /* [[noreturn]] is not practically usable, because with it the syntax
         extern _Noreturn void func (...);
       would not be valid; such a declaration would only be valid with 'extern'
       and '_Noreturn' swapped, or without the 'extern' keyword.  However, some
       AIX system header files and several gnulib header files use precisely
       this syntax with 'extern'.  */
Paul Eggert's avatar
Paul Eggert committed
28
#  define _Noreturn [[noreturn]]
Paul Eggert's avatar
Paul Eggert committed
29 30 31
# elif ((!defined __cplusplus || defined __clang__)                     \
        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
Paul Eggert's avatar
Paul Eggert committed
32 33
   /* _Noreturn works as-is.  */
# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
34
#  define _Noreturn __attribute__ ((__noreturn__))
Paul Eggert's avatar
Paul Eggert committed
35
# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
36 37 38 39 40
#  define _Noreturn __declspec (noreturn)
# else
#  define _Noreturn
# endif
#endif