PR c++/16597
authorKeith Seitz <keiths@redhat.com>
Wed, 16 Apr 2014 21:20:19 +0000 (14:20 -0700)
committerKeith Seitz <keiths@redhat.com>
Wed, 16 Apr 2014 21:20:19 +0000 (14:20 -0700)
[forgot to commit/push these with previous push]

If lookup_symbol_file tries to locate a member variable with NULL name:

      /* A simple lookup failed.  Check if the symbol was defined in
         a base class.  */

      cleanup = make_cleanup (null_cleanup, NULL);

      /* Find the name of the class and the name of the method,
         variable, etc.  */
      prefix_len = cp_entire_prefix_len (name);

      /* If no prefix was found, search "this".  */
      if (prefix_len == 0)
        {
          struct type *type;
          struct symbol *this;

         this = lookup_language_this (language_def (language_cplus), block);
          if (this == NULL)
            {
              do_cleanups (cleanup);
              return NULL;
            }

          type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (this)));
          klass = xstrdup (TYPE_NAME (type));
          nested = xstrdup (name);
        }

TYPE_NAME (type) is NULL, so xstrdup (NULL) and boom!

This can happen, e.g., with clang++.  See testsuite/gdb.cp/namelessclass.exp
or the bugzilla report.

This patch simply adds a fencepost against this case, allowing the caller
of lookup_symbol_file to search other blocks for the right symbol.

gdb/ChangeLog
gdb/cp-namespace.c
gdb/testsuite/ChangeLog

index cbd3a77f37ab1465c556cea44ff4aff61e9708db..cd35011f998b9de6c304afc32467ae7394c844d2 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-16  Keith Seitz  <keiths@redhat.com>
+
+       PR c++/16597
+       * cp-namespace.c (lookup_symbol_file): If the type name of
+       `this' is NULL, return immediately.
+
 2014-04-14  Keith Seitz  <keiths@redhat.com>
 
        PR c++/16253
index 1085556e90c902392918cad4f1f7587c7aada52b..ae7c8527df50e039e9f7d8fe6cbc3a31e9f1e48a 100644 (file)
@@ -694,6 +694,11 @@ lookup_symbol_file (const char *name,
            }
 
          type = check_typedef (TYPE_TARGET_TYPE (SYMBOL_TYPE (this)));
+         /* If TYPE_NAME is NULL, abandon trying to find this symbol.
+            This can happen for lambda functions compiled with clang++,
+            which outputs no name for the container class.  */
+         if (TYPE_NAME (type) == NULL)
+           return NULL;
          klass = xstrdup (TYPE_NAME (type));
          nested = xstrdup (name);
        }
index 7c7bd3484002008a253d63d5660f6a887cafa19e..a7e7dcb623b3821cd98620c57617b81788f3f3e4 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-16  Keith Seitz  <keiths@redhat.com>
+
+       PR c++/16597
+       * gdb.cp/namelessclass.cc: New file.
+       * gdb.cp/namelessclass.exp: New file.
+       * gdb.cp/namelessclass.S: New file.
+
 2014-04-16  Doug Evans  <dje@google.com>
 
        * lib/gdbserver-support.exp (gdbserver_default_get_remote_address):