return b;
}
+/*
+ * Reverse the order of a "struct cdecl" list, and return the new first
+ * element of the list (i.e., the last element of the original list).
+ */
+static struct cdecl *reverse_decls(struct cdecl *decl)
+{
+ struct cdecl *prev, *next;
+
+ for (prev = NULL; decl; decl = next) {
+ next = decl->next;
+ decl->next = prev;
+ prev = decl;
+ }
+
+ return prev;
+}
+
/*
* Alter an abstract declarator (type name) to declare an identifier instead,
* used by the English parser rules to reduce "identifier as type" sequences.
*/
-static struct cdecl *insert_identifier(struct cdecl *decl, struct parse_item *ident)
+static struct cdecl *
+insert_identifier(struct cdecl *decl, struct parse_item *ident)
{
struct cdecl_declarator *d, **p = &decl->declarators;
semi: | T_SEMICOLON
declaration: declspecs declarators semi {
- $$ = $2;
+ $$ = reverse_decls($2);
$$->specifiers = $1;
};
$$->next = $1;
}
-declarators: declarator_wrap | declarator_wrap T_COMMA declarators {
- $$ = $1;
- $$->next = $3;
+declarators: declarator_wrap | declarators T_COMMA declarator_wrap {
+ $$ = $3;
+ $$->next = $1;
}
declarator_wrap: declarator {