[Lldb-commits] [PATCH] D46548: Really test type lookup in TestCppTypeLookup.py

Frederic Riss via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon May 7 13:46:46 PDT 2018


friss created this revision.
friss added reviewers: clayborg, jingham.

... and fix one bug found this way. Currently, the test works not because
types are looked up correctly, but because by injecting local variables
we also materialize the types for Clang. If we disable the local variable
injection, then one check fails.

The reason of the failure is that FindTypes is run with max_matches==1
and this value is passed down to the symbol lookup functions. When the
search is performed only on the basename (like it's the case for an
entity defined in the root namespace), then the search will stop after
having found one match on the basename. But that match might be in a
namespace, we were really just looking up the basename in the accelerator
tables.

The solution is to not pass max_matches down, but to search without a
limit and let RemoveMismatchedTypes do its job afterwards. Note the
patch includes 2 hunks with the same change, but only the latter is
tested. I couldn't find a way to create a testcase for the other
branch of the if ('image lookup -t' allows me to get there, but it
only ever returns one type anyway).


https://reviews.llvm.org/D46548

Files:
  packages/Python/lldbsuite/test/lang/cpp/type_lookup/TestCppTypeLookup.py
  source/Core/Module.cpp


Index: source/Core/Module.cpp
===================================================================
--- source/Core/Module.cpp
+++ source/Core/Module.cpp
@@ -997,6 +997,7 @@
   const bool append = true;
   TypeClass type_class = eTypeClassAny;
   TypeMap typesmap;
+
   if (Type::GetTypeScopeAndBasename(type_name_cstr, type_scope, type_basename,
                                     type_class)) {
     // Check if "name" starts with "::" which means the qualified type starts
@@ -1019,12 +1020,12 @@
       // The "type_name_cstr" will have been modified if we have a valid type
       // class prefix (like "struct", "class", "union", "typedef" etc).
       FindTypes_Impl(sc, ConstString(type_basename), nullptr, append,
-                     max_matches, searched_symbol_files, typesmap);
+                     UINT_MAX, searched_symbol_files, typesmap);
       typesmap.RemoveMismatchedTypes(type_scope, type_basename, type_class,
                                      exact_match);
       num_matches = typesmap.GetSize();
     } else {
-      num_matches = FindTypes_Impl(sc, name, nullptr, append, max_matches,
+      num_matches = FindTypes_Impl(sc, name, nullptr, append, UINT_MAX,
                                    searched_symbol_files, typesmap);
       if (exact_match) {
         std::string name_str(name.AsCString(""));
Index: packages/Python/lldbsuite/test/lang/cpp/type_lookup/TestCppTypeLookup.py
===================================================================
--- packages/Python/lldbsuite/test/lang/cpp/type_lookup/TestCppTypeLookup.py
+++ packages/Python/lldbsuite/test/lang/cpp/type_lookup/TestCppTypeLookup.py
@@ -38,6 +38,11 @@
         # Get frame for current thread
         frame = thread.GetSelectedFrame()
 
+        # We are testing LLDB's type lookup machinery, but if we inject local
+        # variables, the types for those will be found because they have been
+        # imported through the variable, not because the type lookup worked.
+        self.runCmd("settings set target.experimental.inject-local-vars false")
+
         # Make sure we don't accidentally accept structures that exist only
         # in namespaces when evaluating expressions with top level types.
         # Prior to the revision that added this test, we would accidentally


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D46548.145539.patch
Type: text/x-patch
Size: 2292 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20180507/7306248e/attachment.bin>


More information about the lldb-commits mailing list