From 7f3706ebfeb44e6b1f39f95fe44b7099a91c32c9 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Mon, 17 Aug 2015 21:45:42 +0200 Subject: [PATCH] [D] Implement looking up members of D enums. In D, all named enums are explicitly scoped (the C++ equivalent of enum class) so they should be handled as such in the language-specific symbol lookup routines. However so as to support D compilers that don't emit enums as DW_AT_enum_class, need to make sure that appropriate checks for TYPE_DECLARED_CLASS are done. gdb/ChangeLog * d-exp.y (type_aggregate_p): New function. (PrimaryExpression : TypeExp '.' IdentifierExp): Use it. (classify_inner_name): Likewise. * d-namespace.c (d_lookup_nested_symbol): Handle TYPE_CODE_ENUM. --- gdb/ChangeLog | 7 +++++++ gdb/d-exp.y | 19 ++++++++++++++++--- gdb/d-namespace.c | 1 + 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c6a6872..080d90a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-08-17 Iain Buclaw + + * d-exp.y (type_aggregate_p): New function. + (PrimaryExpression : TypeExp '.' IdentifierExp): Use it. + (classify_inner_name): Likewise. + * d-namespace.c (d_lookup_nested_symbol): Handle TYPE_CODE_ENUM. + 2015-08-15 Doug Evans * psymtab.c (add_psymbol_to_bcache): Remove "val" arg. All callers diff --git a/gdb/d-exp.y b/gdb/d-exp.y index e9d21ac..dd87d8a 100644 --- a/gdb/d-exp.y +++ b/gdb/d-exp.y @@ -126,6 +126,8 @@ static int yylex (void); void yyerror (char *); +static int type_aggregate_p (struct type *); + %} /* Although the yacc "value" of an expression is not used, @@ -554,9 +556,7 @@ PrimaryExpression: /* Check if the qualified name resolves as a member of an aggregate or an enum type. */ - if (!(TYPE_CODE (type) == TYPE_CODE_STRUCT - || TYPE_CODE (type) == TYPE_CODE_UNION - || TYPE_CODE (type) == TYPE_CODE_ENUM)) + if (!type_aggregate_p (type)) error (_("`%s' is not defined as an aggregate type."), TYPE_SAFE_NAME (type)); @@ -695,6 +695,17 @@ BasicType: %% +/* Return true if the type is aggregate-like. */ + +static int +type_aggregate_p (struct type *type) +{ + return (TYPE_CODE (type) == TYPE_CODE_STRUCT + || TYPE_CODE (type) == TYPE_CODE_UNION + || (TYPE_CODE (type) == TYPE_CODE_ENUM + && TYPE_DECLARED_CLASS (type))); +} + /* Take care of parsing a number (anything that starts with a digit). Set yylval and return the token type; update lexptr. LEN is the number of characters in it. */ @@ -1440,6 +1451,8 @@ classify_inner_name (struct parser_state *par_state, return classify_name (par_state, block); type = check_typedef (context); + if (!type_aggregate_p (type)) + return ERROR; copy = copy_name (yylval.ssym.stoken); yylval.ssym.sym = d_lookup_nested_symbol (type, copy, block); diff --git a/gdb/d-namespace.c b/gdb/d-namespace.c index 9a558d1..bed8d5b 100644 --- a/gdb/d-namespace.c +++ b/gdb/d-namespace.c @@ -308,6 +308,7 @@ d_lookup_nested_symbol (struct type *parent_type, { case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: + case TYPE_CODE_ENUM: case TYPE_CODE_MODULE: { int size; -- 2.7.4