diff options
Diffstat (limited to 'Examples/test-suite/constant_expr_c.i')
-rw-r--r-- | Examples/test-suite/constant_expr_c.i | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/Examples/test-suite/constant_expr_c.i b/Examples/test-suite/constant_expr_c.i new file mode 100644 index 000000000..41c474996 --- /dev/null +++ b/Examples/test-suite/constant_expr_c.i @@ -0,0 +1,72 @@ +%module constant_expr_c; +/* Tests of constant expressions (C version). */ + +%inline %{ +#if defined __GNUC__ && __GNUC__ >= 5 +// Suppress warnings about constant comparisons. +# pragma GCC diagnostic ignored "-Wbool-compare" +#endif + +#if defined(_MSC_VER) + #pragma warning(disable : 4804) // warning C4804: '<': unsafe use of type 'bool' in operation +#endif + +/* % didn't work in SWIG 1.3.40 and earlier. */ +const int X = 123%7; +#define FOO 12 % 9 +double d_array[12 % 9]; + +/* `<` and `>` in constant expressions caused parse errors before SWIG 4.1.0. + * They're now supported if inside parentheses (and with some restrictions + * on the LHS of `<`. + */ + +// Testcase from https://github.com/swig/swig/issues/635 +#define TEST_A 1 +#define TEST_B 2 +#define TEST_C (TEST_A < TEST_B) +#define TEST_D (TEST_A > TEST_B) +// These have been supported since 1.3.41. +#define TEST_E (TEST_A <= TEST_B) +#define TEST_F (TEST_A >= TEST_B) +// For completeness +#define TEST_G (TEST_A == TEST_B) +#define TEST_H (TEST_A != TEST_B) + +// No warning +#if (TEST_A < TEST_B) +#define TEST_I 1 +#else +#define TEST_I 0 +#endif + +/* Regression test for bug with losing parentheses around < and > operators, + * fixed in 4.2.0. + */ +#define XX (2<(2<2)) +#define YY (2>(2>2)) +int xx() { return (int)(XX); } +int yy() { return (int)(YY); } + +/* sizeof didn't work on an expression before SWIG 4.1.0 except for cases where + * the expression was in parentheses and looked syntactically like a type (so + * sizeof(X) worked because X could be a type syntactically). + */ +const int s1a = sizeof(X); /* worked before 4.1.0 */ +//const int s1b = sizeof X; /* not currently supported */ +const int s2a = sizeof("a string" ); +const int s2b = sizeof "a string"; +const int s3a = sizeof('c'); +const int s3b = sizeof('c'); +const int s4a = sizeof(L"a wstring"); +const int s4b = sizeof L"a wstring"; +const int s5a = sizeof(L'C'); +const int s5b = sizeof L'C'; +const int s6a = sizeof(sizeof(X)); +const int s6b = sizeof sizeof(X); +const int s7a = sizeof(3.14); +const int s7b = sizeof 3.14; +const int s8a = sizeof(2.1e-6); +const int s8b = sizeof 2.1e-6; + +%} |