mirror of https://github.com/swig/swig
Add support for C99 _Bool
SWIG now treats _Bool as an alias for the bool keyword when in C mode.
This commit is contained in:
parent
1c5b689a1a
commit
6567c5d186
|
@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
|
|||
Version 4.3.0 (in progress)
|
||||
===========================
|
||||
|
||||
2024-09-25: olly
|
||||
Add support for C99 _Bool. SWIG now treats _Bool as an alias for
|
||||
the bool keyword when in C mode.
|
||||
|
||||
2024-09-24: olly
|
||||
#2884 SWIG no longer accepts the invalid definition of a function
|
||||
as the final part of a declaration, e.g.
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
%module cbooltest
|
||||
|
||||
%{
|
||||
#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||
/* C99 _Bool should be supported by the compiler. */
|
||||
# include <stdbool.h>
|
||||
#else
|
||||
/* C99 _Bool and stdbool.h may not be supported, so define a hacky version so
|
||||
* we can still test SWIG's support. */
|
||||
# define _Bool unsigned char
|
||||
# define bool _Bool
|
||||
# define true 1
|
||||
# define false 1
|
||||
#endif
|
||||
%}
|
||||
|
||||
%inline %{
|
||||
_Bool do_and(_Bool a, _Bool b) { return a && b; }
|
||||
_Bool do_or(_Bool a, _Bool b) { return a || b; }
|
||||
%}
|
||||
|
||||
%constant _Bool TRUE_CONSTANT = true;
|
||||
%constant _Bool FALSE_CONSTANT = false;
|
|
@ -0,0 +1,5 @@
|
|||
%module xxx
|
||||
struct A {
|
||||
// C99 _Bool should not be a keyword in C++ so this should not give an error.
|
||||
bool _Bool;
|
||||
};
|
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
require "tests.php";
|
||||
|
||||
check::equal(cbooltest::do_or(true, false), true, "do_or() test failed");
|
||||
check::equal(cbooltest::do_and(true, false), false, "do_and() test failed");
|
||||
check::equal(cbooltest::TRUE_CONSTANT, true, "TRUE_CONSTANT test failed");
|
||||
check::equal(cbooltest::FALSE_CONSTANT, false, "FALSE_CONSTANT test failed");
|
|
@ -0,0 +1,13 @@
|
|||
import cbooltest
|
||||
|
||||
if not cbooltest.do_or(True, False):
|
||||
raise RuntimeError("bad _Bool support")
|
||||
|
||||
if cbooltest.do_and(True, False):
|
||||
raise RuntimeError("bad _Bool support")
|
||||
|
||||
if not cbooltest.TRUE_CONSTANT:
|
||||
raise RuntimeError("bad _Bool support")
|
||||
|
||||
if cbooltest.FALSE_CONSTANT:
|
||||
raise RuntimeError("bad _Bool support")
|
|
@ -966,6 +966,11 @@ num_common: {
|
|||
if (strcmp(yytext, "class") == 0) {
|
||||
Swig_warning(WARN_PARSE_CLASS_KEYWORD, cparse_file, cparse_line, "class keyword used, but not in C++ mode.\n");
|
||||
}
|
||||
if (strcmp(yytext, "_Bool") == 0) {
|
||||
/* C99 boolean type. */
|
||||
yylval.type = NewSwigType(T_BOOL);
|
||||
return (TYPE_BOOL);
|
||||
}
|
||||
if (strcmp(yytext, "_Complex") == 0) {
|
||||
yylval.type = NewSwigType(T_COMPLEX);
|
||||
return (TYPE_COMPLEX);
|
||||
|
|
Loading…
Reference in New Issue