1 /* { dg-do compile } */
2 /* { dg-options "-fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */
3 
4 #include <stddef.h>
5 #include <stdlib.h>
6 
7 /* Minimal reimplementation of cpython API.  */
8 typedef struct PyObject {} PyObject;
9 extern int PyArg_ParseTuple (PyObject *args, const char *fmt, ...);
10 extern PyObject *PyList_New (int);
11 extern PyObject *PyLong_FromLong(long);
12 extern void PyList_Append(PyObject *list, PyObject *item);
13 
14 PyObject *
make_a_list_of_random_ints_badly(PyObject * self,PyObject * args)15 make_a_list_of_random_ints_badly(PyObject *self,
16 				 PyObject *args)
17 {
18   PyObject *list, *item;
19   long count, i;
20 
21   if (!PyArg_ParseTuple(args, "i", &count)) {
22     return NULL;
23   }
24 
25   list = PyList_New(0);
26 
27   for (i = 0; i < count; i++) {
28     item = PyLong_FromLong(random());
29     PyList_Append(list, item); /* { dg-line PyList_Append } */
30   }
31 
32   return list;
33 
34   /* { dg-error "passing NULL as argument 1 to 'PyList_Append' which requires a non-NULL parameter" "" { target *-*-* } PyList_Append } */
35   /* { dg-begin-multiline-output "" }
36    29 |     PyList_Append(list, item);
37       |     ^~~~~~~~~~~~~~~~~~~~~~~~~
38   'make_a_list_of_random_ints_badly': events 1-3
39     |
40     |   25 |   list = PyList_New(0);
41     |      |          ^~~~~~~~~~~~~
42     |      |          |
43     |      |          (1) when 'PyList_New' fails, returning NULL
44     |   26 |
45     |   27 |   for (i = 0; i < count; i++) {
46     |      |   ~~~
47     |      |   |
48     |      |   (2) when 'i < count'
49     |   28 |     item = PyLong_FromLong(random());
50     |   29 |     PyList_Append(list, item);
51     |      |     ~~~~~~~~~~~~~~~~~~~~~~~~~
52     |      |     |
53     |      |     (3) when calling 'PyList_Append', passing NULL from (1) as argument 1
54     |
55      { dg-end-multiline-output "" } */
56 }
57