summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2015-08-17 21:45:42 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2015-08-17 21:53:47 +0200
commit7f3706ebfeb44e6b1f39f95fe44b7099a91c32c9 (patch)
tree86932e98d06300e8fa849041cee59ddd96b9c369
parentad89c2aa677c28c76ffd5a35e2b36eece4d82597 (diff)
downloadbinutils-gdb-7f3706ebfeb44e6b1f39f95fe44b7099a91c32c9.tar.gz
[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.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/d-exp.y19
-rw-r--r--gdb/d-namespace.c1
3 files changed, 24 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c6a6872cb89..080d90a2032 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2015-08-17 Iain Buclaw <ibuclaw@gdcproject.org>
+
+ * 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 <xdje42@gmail.com>
* psymtab.c (add_psymbol_to_bcache): Remove "val" arg. All callers
diff --git a/gdb/d-exp.y b/gdb/d-exp.y
index e9d21ac50d2..dd87d8aa188 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 9a558d1aa33..bed8d5b1cc8 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;