1 /* Reduced from qemu-7.2.0's qobject/json-parser.c, which
2 is licensed under LGPLv2.1 or later. */
4 /* { dg-additional-options "-fno-analyzer-call-summaries -Wno-analyzer-too-complex" } */
6 #include "../../gcc.dg/analyzer/analyzer-decls.h"
9 typedef __builtin_va_list
va_list;
11 typedef struct _GQueue GQueue
;
12 typedef struct Error Error
;
13 typedef struct QList QList
;
14 typedef struct QObject QObject
;
22 struct QObjectBase_ base
;
25 #define QOBJECT(obj) ((QObject *)obj)
26 #define qobject_unref(OBJ) /* [...snip...] */
28 typedef struct QTailQLink
{
30 struct QTailQLink
*tql_prev
;
34 struct QObjectBase_ base
;
36 struct QListEntry
*tqh_first
;
40 QList
*qlist_new(void);
41 void qlist_append_obj(QList
*qlist
, QObject
*obj
);
43 typedef enum json_token_type
{
53 typedef struct JSONToken JSONToken
;
62 typedef struct JSONParserContext
{
68 static QObject
*parse_value(JSONParserContext
*ctxt
);
70 JSONToken
*parser_context_pop_token(JSONParserContext
*ctxt
);
71 JSONToken
*parser_context_peek_token(JSONParserContext
*ctxt
);
73 static QObject
*parse_array(JSONParserContext
*ctxt
) {
75 JSONToken
*token
, *peek
;
77 token
= parser_context_pop_token(ctxt
);
81 peek
= parser_context_peek_token(ctxt
);
86 if (peek
->type
!= JSON_RSQUARE
) {
89 obj
= parse_value(ctxt
); /* { dg-bogus "infinite recursion" } */
94 qlist_append_obj(list
, obj
);
96 token
= parser_context_pop_token(ctxt
);
101 while (token
->type
!= JSON_RSQUARE
) {
102 if (token
->type
!= JSON_COMMA
) {
106 obj
= parse_value(ctxt
);
111 qlist_append_obj(list
, obj
);
113 token
= parser_context_pop_token(ctxt
);
119 (void)parser_context_pop_token(ctxt
);
122 return QOBJECT(list
);
129 QObject
*parse_keyword(JSONParserContext
*ctxt
);
131 QObject
*parse_value(JSONParserContext
*ctxt
) {
134 token
= parser_context_peek_token(ctxt
);
139 switch (token
->type
) {
141 return parse_array(ctxt
); /* { dg-bogus "infinite recursion" } */
143 return parse_keyword(ctxt
);