+static statement_t *parse_local_label_declaration(void) {
+ statement_t *statement = allocate_statement_zero(STATEMENT_DECLARATION);
+ statement->base.source_position = token.source_position;
+
+ eat(T___label__);
+
+ declaration_t *begin = NULL, *end = NULL;
+
+ while (true) {
+ if (token.type != T_IDENTIFIER) {
+ parse_error_expected("while parsing local label declaration",
+ T_IDENTIFIER, NULL);
+ goto end_error;
+ }
+ symbol_t *symbol = token.v.symbol;
+ declaration_t *declaration = get_declaration(symbol, NAMESPACE_LOCAL_LABEL);
+ if (declaration != NULL) {
+ errorf(HERE, "multiple definitions of '__label__ %Y' (previous definition at %P)",
+ symbol, &declaration->source_position);
+ } else {
+ declaration = allocate_declaration_zero();
+ declaration->namespc = NAMESPACE_LOCAL_LABEL;
+ declaration->source_position = token.source_position;
+ declaration->symbol = symbol;
+ declaration->parent_scope = scope;
+ declaration->init.statement = NULL;
+
+ if (end != NULL)
+ end->next = declaration;
+ end = declaration;
+ if (begin == NULL)
+ begin = declaration;
+
+ local_label_push(declaration);
+ }
+ next_token();
+
+ if (token.type != ',')
+ break;
+ next_token();
+ }
+ eat(';');
+end_error:
+ statement->declaration.declarations_begin = begin;
+ statement->declaration.declarations_end = end;
+ return statement;
+}
+