[RISC-V] Avoid unnecessary extensions when value is already extended
[official-gcc.git] / gcc / testsuite / c-c++-common / analyzer / infinite-recursion-pr108524-1.c
blob26fc8d2e8d4f71982ffedae2dfbfdce9f2627b59
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;
16 struct QObjectBase_ {
17 /* [...snip...] */
21 struct QObject {
22 struct QObjectBase_ base;
25 #define QOBJECT(obj) ((QObject *)obj)
26 #define qobject_unref(OBJ) /* [...snip...] */
28 typedef struct QTailQLink {
29 void *tql_next;
30 struct QTailQLink *tql_prev;
31 } QTailQLink;
33 struct QList {
34 struct QObjectBase_ base;
35 union {
36 struct QListEntry *tqh_first;
37 QTailQLink tqh_circ;
38 } head;
40 QList *qlist_new(void);
41 void qlist_append_obj(QList *qlist, QObject *obj);
43 typedef enum json_token_type {
44 /* [...snip...] */
45 JSON_LSQUARE,
46 JSON_RSQUARE,
47 /* [...snip...] */
48 JSON_COMMA,
49 /* [...snip...] */
50 JSON_KEYWORD,
51 /* [...snip...] */
52 } JSONTokenType;
53 typedef struct JSONToken JSONToken;
55 struct JSONToken {
56 JSONTokenType type;
57 int x;
58 int y;
59 char str[];
62 typedef struct JSONParserContext {
63 Error *err;
64 JSONToken *current;
65 GQueue *buf;
66 va_list *ap;
67 } 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) {
74 QList *list = NULL;
75 JSONToken *token, *peek;
77 token = parser_context_pop_token(ctxt);
79 list = qlist_new();
81 peek = parser_context_peek_token(ctxt);
82 if (peek == NULL) {
83 goto out;
86 if (peek->type != JSON_RSQUARE) {
87 QObject *obj;
89 obj = parse_value(ctxt); /* { dg-bogus "infinite recursion" } */
90 if (obj == NULL) {
91 goto out;
94 qlist_append_obj(list, obj);
96 token = parser_context_pop_token(ctxt);
97 if (token == NULL) {
98 goto out;
101 while (token->type != JSON_RSQUARE) {
102 if (token->type != JSON_COMMA) {
103 goto out;
106 obj = parse_value(ctxt);
107 if (obj == NULL) {
108 goto out;
111 qlist_append_obj(list, obj);
113 token = parser_context_pop_token(ctxt);
114 if (token == NULL) {
115 goto out;
118 } else {
119 (void)parser_context_pop_token(ctxt);
122 return QOBJECT(list);
124 out:
125 qobject_unref(list);
126 return NULL;
129 QObject *parse_keyword(JSONParserContext *ctxt);
131 QObject *parse_value(JSONParserContext *ctxt) {
132 JSONToken *token;
134 token = parser_context_peek_token(ctxt);
135 if (token == NULL) {
136 return NULL;
139 switch (token->type) {
140 case JSON_LSQUARE:
141 return parse_array(ctxt); /* { dg-bogus "infinite recursion" } */
142 case JSON_KEYWORD:
143 return parse_keyword(ctxt);
144 default:
145 return NULL;