From c4f87ca6dbe041e2a331e5054a76c9134f29d545 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Wed, 16 Apr 2014 14:20:19 -0700 Subject: [PATCH] PR c++/16597 [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 | 6 ++++++ gdb/cp-namespace.c | 5 +++++ gdb/testsuite/ChangeLog | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cbd3a77f37a..cd35011f998 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-04-16 Keith Seitz + + PR c++/16597 + * cp-namespace.c (lookup_symbol_file): If the type name of + `this' is NULL, return immediately. + 2014-04-14 Keith Seitz PR c++/16253 diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 1085556e90c..ae7c8527df5 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -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); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7c7bd348400..a7e7dcb623b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2014-04-16 Keith Seitz + + 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 * lib/gdbserver-support.exp (gdbserver_default_get_remote_address): -- 2.39.2