diff mbox series

[v2,1/2] struct_union_enum_specifier: always initialize sym->scope

Message ID 20200219162911.GA26790@redhat.com (mailing list archive)
State Mainlined, archived
Headers show
Series [v2,1/2] struct_union_enum_specifier: always initialize sym->scope | expand

Commit Message

Oleg Nesterov Feb. 19, 2020, 4:29 p.m. UTC
Currently it is not possible to figure out the scope of the private
struct/union/enum type, its ->scope is NULL because bind_symbol() is
not called.

Change struct_union_enum_specifier() to set sym->scope = block_scope
in this case, this is what bind_symbol() does when type has a name.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
 parse.c | 2 ++
 scope.c | 5 +++++
 scope.h | 1 +
 3 files changed, 8 insertions(+)

Comments

Luc Van Oostenryck Feb. 20, 2020, 12:56 a.m. UTC | #1
On Wed, Feb 19, 2020 at 05:29:11PM +0100, Oleg Nesterov wrote:
> Currently it is not possible to figure out the scope of the private
> struct/union/enum type, its ->scope is NULL because bind_symbol() is
> not called.
> 
> Change struct_union_enum_specifier() to set sym->scope = block_scope
> in this case, this is what bind_symbol() does when type has a name.

Thanks.
I've just changed the comment to "used by dissect" because
elsewhere the scope or toplevel()s only relevant for symbols.

-- Luc
Oleg Nesterov Feb. 20, 2020, 11:57 a.m. UTC | #2
On 02/20, Luc Van Oostenryck wrote:
>
> On Wed, Feb 19, 2020 at 05:29:11PM +0100, Oleg Nesterov wrote:
> > Currently it is not possible to figure out the scope of the private
> > struct/union/enum type, its ->scope is NULL because bind_symbol() is
> > not called.
> >
> > Change struct_union_enum_specifier() to set sym->scope = block_scope
> > in this case, this is what bind_symbol() does when type has a name.
>
> Thanks.
> I've just changed the comment to "used by dissect"

Great, thanks!

> because
> elsewhere the scope or toplevel()s only relevant for symbols.

Cough... can't resist ;)

Not really, see struct_union_enum_specifier()->is_outer_scope(). But
yes sure, this is only when ->ident != NULL.

Oleg.
Luc Van Oostenryck Feb. 20, 2020, 12:15 p.m. UTC | #3
On Thu, Feb 20, 2020 at 12:57:37PM +0100, Oleg Nesterov wrote:
> On 02/20, Luc Van Oostenryck wrote:
> >
> > On Wed, Feb 19, 2020 at 05:29:11PM +0100, Oleg Nesterov wrote:
> > > Currently it is not possible to figure out the scope of the private
> > > struct/union/enum type, its ->scope is NULL because bind_symbol() is
> > > not called.
> > >
> > > Change struct_union_enum_specifier() to set sym->scope = block_scope
> > > in this case, this is what bind_symbol() does when type has a name.
> >
> > Thanks.
> > I've just changed the comment to "used by dissect"
> 
> Great, thanks!
> 
> > because
> > elsewhere the scope or toplevel()s only relevant for symbols.
> 
> Cough... can't resist ;)
> 
> Not really, see struct_union_enum_specifier()->is_outer_scope(). But
> yes sure, this is only when ->ident != NULL.

Ah yes, sorry, I wasn't clear enough here. By 'symbol' here, I
effectively meant: "a name (with its associated semantic)", not
a 'struct symbol'.
 
-- Luc
diff mbox series

Patch

diff --git a/parse.c b/parse.c
index a08165a..3e7c60e 100644
--- a/parse.c
+++ b/parse.c
@@ -772,6 +772,8 @@  static struct token *struct_union_enum_specifier(enum type type,
 	}
 
 	sym = alloc_symbol(token->pos, type);
+	/* make toplevel(sym->scope) work */
+	set_current_scope(sym);
 	token = parse(token->next, sym);
 	ctx->ctype.base_type = sym;
 	token =  expect(token, '}', "at end of specifier");
diff --git a/scope.c b/scope.c
index cbf2fcf..420c0f5 100644
--- a/scope.c
+++ b/scope.c
@@ -40,6 +40,11 @@  struct scope	*block_scope = &builtin_scope,		// regular automatic variables etc
 		*file_scope = &builtin_scope,		// static
 		*global_scope = &builtin_scope;		// externally visible
 
+void set_current_scope(struct symbol *sym)
+{
+	sym->scope = block_scope;
+}
+
 void bind_scope(struct symbol *sym, struct scope *scope)
 {
 	sym->scope = scope;
diff --git a/scope.h b/scope.h
index d9a14aa..3cad514 100644
--- a/scope.h
+++ b/scope.h
@@ -53,6 +53,7 @@  extern void end_symbol_scope(void);
 extern void start_function_scope(void);
 extern void end_function_scope(void);
 
+extern void set_current_scope(struct symbol *);
 extern void bind_scope(struct symbol *, struct scope *);
 extern void rebind_scope(struct symbol *, struct scope *);