blob: 6cbc1971b52bf2abf24ddc5971b5fc6bf5b2d80d [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-fanalyzer" } */
/* { dg-require-effective-target analyzer } */
#include "gil.h"
void test_1 (void)
{
Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS
}
void test_2 (PyObject *obj)
{
Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
Py_INCREF (obj); /* { dg-warning "use of PyObject '\\*obj' without the GIL" } */
Py_DECREF (obj);
Py_END_ALLOW_THREADS
}
void test_3 (PyObject *obj)
{
Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
Py_BEGIN_ALLOW_THREADS /* { dg-warning "nested usage of 'Py_BEGIN_ALLOW_THREADS'" } */
Py_END_ALLOW_THREADS
Py_END_ALLOW_THREADS
}
void test_4 (PyObject *obj)
{
/* These aren't nested, so should be OK. */
Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS
Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS
}
/* Interprocedural example of erroneously nested usage. */
static void __attribute__((noinline))
called_by_test_5 (void)
{
Py_BEGIN_ALLOW_THREADS /* { dg-warning "nested usage of 'Py_BEGIN_ALLOW_THREADS'" } */
Py_END_ALLOW_THREADS
}
void test_5 (PyObject *obj)
{
Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
called_by_test_5 ();
Py_END_ALLOW_THREADS
}
/* Interprocedural example of bogusly using a PyObject outside of GIL. */
static void __attribute__((noinline))
called_by_test_6 (PyObject *obj)
{
Py_INCREF (obj); /* { dg-warning "use of PyObject '\\*obj' without the GIL" } */
Py_DECREF (obj);
}
void test_6 (PyObject *obj)
{
Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
called_by_test_6 (obj);
Py_END_ALLOW_THREADS
}
extern void called_by_test_7 (PyObject *obj);
void test_7 (PyObject *obj)
{
Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
called_by_test_7 (obj); /* { dg-warning "use of PyObject as argument 1 of 'called_by_test_7' without the GIL" } */
Py_END_ALLOW_THREADS
}
typedef void (*callback_t) (PyObject *);
void test_8 (PyObject *obj, callback_t cb)
{
Py_BEGIN_ALLOW_THREADS /* { dg-message "releasing the GIL here" } */
cb (obj); /* { dg-warning "use of PyObject as argument 1 of call without the GIL" } */
Py_END_ALLOW_THREADS
}