PR symtab/11464:
authorTom Tromey <tromey@redhat.com>
Tue, 12 Feb 2013 20:27:36 +0000 (20:27 +0000)
committerTom Tromey <tromey@redhat.com>
Tue, 12 Feb 2013 20:27:36 +0000 (20:27 +0000)
* c-exp.y (lex_one_token): Initialize other fields of yylval on
NAME return.
(classify_inner_name): Remove 'first_name' argument, add
'context'.  Remove unused variable.
(yylex): Explicitly maintain the context type.  Exit loop earlier
if NAME result is seen.
gdb/testsuite
* gdb.cp/m-static.cc (gnu_obj_1::~gnu_obj_1): New destructor.
* gdb.cp/m-static.exp: Add tests to print quoted destructor.

gdb/ChangeLog
gdb/c-exp.y
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/m-static.cc
gdb/testsuite/gdb.cp/m-static.exp

index 721f224..ad0ed74 100644 (file)
@@ -1,3 +1,13 @@
+2013-02-12  Tom Tromey  <tromey@redhat.com>
+
+       PR symtab/11464:
+       * c-exp.y (lex_one_token): Initialize other fields of yylval on
+       NAME return.
+       (classify_inner_name): Remove 'first_name' argument, add
+       'context'.  Remove unused variable.
+       (yylex): Explicitly maintain the context type.  Exit loop earlier
+       if NAME result is seen.
+
 2013-02-12  Pedro Alves  <palves@redhat.com>
 
        * amd64-darwin-tdep.c: Add (C) after Copyright.
index 376c574..f6659d4 100644 (file)
@@ -2719,6 +2719,10 @@ lex_one_token (void)
 
   if (parse_completion && *lexptr == '\0')
     saw_name_at_eof = 1;
+
+  yylval.ssym.stoken = yylval.sval;
+  yylval.ssym.sym = NULL;
+  yylval.ssym.is_a_field_of_this = 0;
   return NAME;
 }
 
@@ -2859,26 +2863,26 @@ classify_name (const struct block *block)
 }
 
 /* Like classify_name, but used by the inner loop of the lexer, when a
-   name might have already been seen.  FIRST_NAME is true if the token
-   in `yylval' is the first component of a name, false otherwise.  */
+   name might have already been seen.  CONTEXT is the context type, or
+   NULL if this is the first component of a name.  */
 
 static int
-classify_inner_name (const struct block *block, int first_name)
+classify_inner_name (const struct block *block, struct type *context)
 {
   struct type *type;
   char *copy;
 
-  if (first_name)
+  if (context == NULL)
     return classify_name (block);
 
-  type = check_typedef (yylval.tsym.type);
+  type = check_typedef (context);
   if (TYPE_CODE (type) != TYPE_CODE_STRUCT
       && TYPE_CODE (type) != TYPE_CODE_UNION
       && TYPE_CODE (type) != TYPE_CODE_NAMESPACE)
     return ERROR;
 
-  copy = copy_name (yylval.tsym.stoken);
-  yylval.ssym.sym = cp_lookup_nested_symbol (yylval.tsym.type, copy, block);
+  copy = copy_name (yylval.ssym.stoken);
+  yylval.ssym.sym = cp_lookup_nested_symbol (type, copy, block);
   if (yylval.ssym.sym == NULL)
     return ERROR;
 
@@ -2893,7 +2897,6 @@ classify_inner_name (const struct block *block, int first_name)
       return TYPENAME;
 
     default:
-      yylval.ssym.is_a_field_of_this = 0;
       return NAME;
     }
   internal_error (__FILE__, __LINE__, _("not reached"));
@@ -2915,6 +2918,7 @@ yylex (void)
 {
   token_and_value current;
   int first_was_coloncolon, last_was_coloncolon, first_iter;
+  struct type *context_type = NULL;
 
   if (popping && !VEC_empty (token_and_value, token_fifo))
     {
@@ -2936,7 +2940,10 @@ yylex (void)
   last_was_coloncolon = first_was_coloncolon;
   obstack_free (&name_obstack, obstack_base (&name_obstack));
   if (!last_was_coloncolon)
-    obstack_grow (&name_obstack, yylval.sval.ptr, yylval.sval.length);
+    {
+      obstack_grow (&name_obstack, yylval.sval.ptr, yylval.sval.length);
+      context_type = yylval.tsym.type;
+    }
   current.value = yylval;
   first_iter = 1;
   while (1)
@@ -2953,7 +2960,7 @@ yylex (void)
          classification = classify_inner_name (first_was_coloncolon
                                                ? NULL
                                                : expression_context_block,
-                                               first_iter);
+                                               context_type);
          /* We keep going until we either run out of names, or until
             we have a qualified name which is not a type.  */
          if (classification != TYPENAME && classification != NAME)
@@ -2964,7 +2971,7 @@ yylex (void)
            }
 
          /* Update the partial name we are constructing.  */
-         if (!first_iter)
+         if (context_type != NULL)
            {
              /* We don't want to put a leading "::" into the name.  */
              obstack_grow_str (&name_obstack, "::");
@@ -2978,6 +2985,11 @@ yylex (void)
          current.token = classification;
 
          last_was_coloncolon = 0;
+         
+         if (classification == NAME)
+           break;
+
+         context_type = yylval.tsym.type;
        }
       else if (next.token == COLONCOLON && !last_was_coloncolon)
        last_was_coloncolon = 1;
index 81c1401..cd0989f 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-12  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.cp/m-static.cc (gnu_obj_1::~gnu_obj_1): New destructor.
+       * gdb.cp/m-static.exp: Add tests to print quoted destructor.
+
 2013-02-12  Pedro Alves  <palves@redhat.com>
 
        * gdb.base/catch-signal.c: Update copyright years.
index e9dce18..8472988 100644 (file)
@@ -17,6 +17,7 @@ protected:
 
 public:
   gnu_obj_1(antiquities a, long l) {}
+  ~gnu_obj_1() {}
 
   long method ()
   {
index 38d2498..ae4b2ad 100644 (file)
@@ -64,6 +64,14 @@ gdb_test "print test1.key2" "\\$\[0-9\]* = 77" "simple object, static long"
 # simple object, static enum
 gdb_test "print test1.value" "\\$\[0-9\]* = oriental" "simple object, static enum"
 
+gdb_test "print test1.'~gnu_obj_1'" \
+    { = {void \(gnu_obj_1 \*( const)?, int\)} 0x[0-9a-f]+ <gnu_obj_1::~gnu_obj_1\(\)>} \
+    "simple object instance, print quoted destructor"
+
+gdb_test "ptype gnu_obj_1::'~gnu_obj_1'" \
+    {type = void \(gnu_obj_1 \* const\)} \
+    "simple object class, ptype quoted destructor"
+
 # Two.
 
 # derived template object, base static const bool