[D] Allow enum scopes to be looked up.

Message ID CABOHX+c7k13v7Lqw+3LcnRo6DTz+yoSkoS+fzaBwpYiHn7GukA@mail.gmail.com
State New, archived
Headers

Commit Message

Iain Buclaw Aug. 15, 2015, 6:57 a.m. UTC
  Hi,

In D, all named enums are scoped (the C++ equivalent of enum class) so
they should be handled in the language-specific symbol lookup.
However so as to support D compilers that don't emit enums as
DW_AT_enum_class (currently none, but I'm will shortly be adding it to
gdc), need to make sure that proper a safeguard is in place.

Regards
Iain.
  

Comments

Pedro Alves Aug. 17, 2015, 4:41 p.m. UTC | #1
On 08/15/2015 07:57 AM, Iain Buclaw wrote:
> Hi,
> 
> In D, all named enums are scoped (the C++ equivalent of enum class) so
> they should be handled in the language-specific symbol lookup.
> However so as to support D compilers that don't emit enums as
> DW_AT_enum_class (currently none, but I'm will shortly be adding it to
> gdc), need to make sure that proper a safeguard is in place.

Looks fine to me.

Thanks,
Pedro Alves
  

Patch

---
2015-08-15  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.

diff --git a/gdb/d-exp.y b/gdb/d-exp.y
index e23a0aa..05dc449 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;