summaryrefslogtreecommitdiff
path: root/Examples/test-suite/preproc_defined.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/preproc_defined.i')
-rw-r--r--Examples/test-suite/preproc_defined.i108
1 files changed, 108 insertions, 0 deletions
diff --git a/Examples/test-suite/preproc_defined.i b/Examples/test-suite/preproc_defined.i
new file mode 100644
index 000000000..2fa2f9856
--- /dev/null
+++ b/Examples/test-suite/preproc_defined.i
@@ -0,0 +1,108 @@
+%module preproc_defined
+
+// Check 'defined' passes through the preprocessor without being processed like '#if defined(ABC)' would be (SF bug #1940536)
+
+%define DEFINED_MACRO
+%{
+ int defined(int b) {
+ return b > 10;
+ }
+ int vvv = -1;
+ void fn(int val) {
+ if (defined(val))
+ vvv = 1;
+ else
+ vvv = 0;
+ }
+%}
+%enddef
+
+DEFINED_MACRO
+
+%{
+int checking(void) {
+ fn(11);
+ int okay = (vvv == 1);
+ fn(9);
+ okay = okay && (vvv == 0);
+ return okay; /* should be 1 */
+}
+%}
+
+%inline %{
+int call_checking(void) {
+ return checking();
+}
+%}
+
+/*****************************************************************************/
+/* Check #if/#elif defined() macro expansions
+ Also checks #if/#elif defined() works correctly within macros... this is not
+ standard C, but is now relied on in the SWIG library. */
+/*****************************************************************************/
+
+#define AAA
+#define BBB
+#define CCC
+
+#if defined(AAA)\
+&& defined(BBB) \
+&& defined(CCC)
+%{
+void thing(int i) {}
+void stuff(int i) {}
+struct Defined {
+ int defined;
+};
+void bumpf(int i) {}
+%}
+#else
+#endif
+
+%define ANOTHER_MACRO(TYPE)
+
+#if defined(AAA) && defined(BBB) && defined(CCC)
+void thing(TYPE) {}
+#else
+void thing_not(TYPE) {}
+#endif
+
+#if defined(AAA) &&\
+ defined(BBB) \\
+&& defined(CCC)
+void stuff(TYPE) {}
+#else
+void stuff_not(TYPE);
+#endif
+
+#if defined(0)
+void defined_not(TYPE);
+#elif defined(AAA) && defined( BBB ) && defined(CCC)
+struct Defined {
+ int defined;
+};
+#else
+void defined_not(TYPE);
+#endif
+
+#if !( defined(AAA) \
+ defined(BBB) \\
+&& defined(CCC) )
+void bumpf_not(TYPE);
+#else
+void bumpf(TYPE) {}
+#endif
+
+%enddef
+
+ANOTHER_MACRO(int)
+
+%{
+void another_macro_checking(void) {
+ struct Defined d;
+ d.defined = 10;
+ thing(10);
+ stuff(10);
+ bumpf(10);
+}
+%}