lint: add grammar rule for the beginning of a designation
This will be necessary to properly implement handling of initializers and braced initializer-lists. No functional change for now since the designation is already reset after each expression and '}'. To handle initializations properly, the designation must not be reset after each expression, it must advance to the next member instead.
This commit is contained in:
parent
195be17bb9
commit
f960c40512
|
@ -1,5 +1,5 @@
|
|||
%{
|
||||
/* $NetBSD: cgram.y,v 1.376 2021/12/18 11:37:00 rillig Exp $ */
|
||||
/* $NetBSD: cgram.y,v 1.377 2021/12/20 19:34:01 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
|
||||
|
@ -35,7 +35,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(__RCSID) && !defined(lint)
|
||||
__RCSID("$NetBSD: cgram.y,v 1.376 2021/12/18 11:37:00 rillig Exp $");
|
||||
__RCSID("$NetBSD: cgram.y,v 1.377 2021/12/20 19:34:01 rillig Exp $");
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
@ -1561,14 +1561,21 @@ initializer_list_item: /* helper */
|
|||
;
|
||||
|
||||
designation: /* C99 6.7.8 "Initialization" */
|
||||
designator_list T_ASSIGN
|
||||
begin_designation designator_list T_ASSIGN
|
||||
| identifier T_COLON {
|
||||
/* GCC style struct or union member name in initializer */
|
||||
gnuism(315);
|
||||
begin_designation();
|
||||
add_designator_member($1);
|
||||
}
|
||||
;
|
||||
|
||||
begin_designation: /* lint-specific helper */
|
||||
/* empty */ {
|
||||
begin_designation();
|
||||
}
|
||||
;
|
||||
|
||||
designator_list: /* C99 6.7.8 "Initialization" */
|
||||
designator
|
||||
| designator_list designator
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: externs1.h,v 1.142 2021/12/16 23:46:21 rillig Exp $ */
|
||||
/* $NetBSD: externs1.h,v 1.143 2021/12/20 19:34:01 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Jochen Pohl
|
||||
|
@ -332,6 +332,7 @@ extern sym_t **current_initsym(void);
|
|||
extern void init_rbrace(void);
|
||||
extern void init_lbrace(void);
|
||||
extern void init_expr(tnode_t *);
|
||||
extern void begin_designation(void);
|
||||
extern void add_designator_member(sbuf_t *);
|
||||
extern void add_designator_subscript(range_t);
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: init.c,v 1.222 2021/12/19 23:50:27 rillig Exp $ */
|
||||
/* $NetBSD: init.c,v 1.223 2021/12/20 19:34:01 rillig Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994, 1995 Jochen Pohl
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(__RCSID) && !defined(lint)
|
||||
__RCSID("$NetBSD: init.c,v 1.222 2021/12/19 23:50:27 rillig Exp $");
|
||||
__RCSID("$NetBSD: init.c,v 1.223 2021/12/20 19:34:01 rillig Exp $");
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -987,6 +987,16 @@ end_initialization(void)
|
|||
debug_step("end initialization");
|
||||
}
|
||||
|
||||
void
|
||||
begin_designation(void)
|
||||
{
|
||||
brace_level *bl;
|
||||
|
||||
bl = current_init()->in_brace_level;
|
||||
lint_assert(bl != NULL);
|
||||
designation_reset(&bl->bl_designation);
|
||||
}
|
||||
|
||||
void
|
||||
add_designator_member(sbuf_t *sb)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue