Correctly handle using foo = std::foo inside namespaces.

Summary:
The gdb pretty printer misprints variables declared via
using declarations of the form:

namespace foo {
using string_view = std::string_view;

string_view bar;
}

This change fixes that, by deferring the decision to ignore
types not inside std until after desugaring.

Reviewers: #libc!

Subscribers: broadwaylamb, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D76816
This commit is contained in:
Sterling Augustine 2020-03-25 18:09:25 -07:00
parent b727aabcb8
commit 6c6fba8808
2 changed files with 21 additions and 5 deletions

View File

@ -153,6 +153,16 @@ void string_test() {
"\"mehmet bizim dostumuz agzi kirik testimiz\"");
}
namespace a_namespace {
// To test name-lookup in the presence of using inside a namespace. Inside this
// namespace, unqualified string_view variables will appear in the debug info as
// "a_namespace::string_view, rather than "std::string_view".
//
// There is nothing special here about string_view; it's just the data structure
// where lookup with using inside a namespace wasn't always working.
using string_view = std::string_view;
void string_view_test() {
std::string_view i_am_empty;
ComparePrettyPrintToChars(i_am_empty, "std::string_view of length 0: \"\"");
@ -166,6 +176,12 @@ void string_view_test() {
std::string_view wonderful(&char_arr[7], 9);
ComparePrettyPrintToChars(
wonderful, "std::string_view of length 9: \"wonderful\"");
const char char_arr1[] = "namespace_stringview";
string_view namespace_stringview(&char_arr1[10], 10);
ComparePrettyPrintToChars(
namespace_stringview, "std::string_view of length 10: \"stringview\"");
}
}
void u16string_test() {
@ -628,7 +644,7 @@ int main(int argc, char* argv[]) {
framework_self_test();
string_test();
string_view_test();
a_namespace::string_view_test();
u32string_test();
tuple_test();

View File

@ -982,10 +982,10 @@ class LibcxxPrettyPrinter(object):
# Don't attempt types known to be inside libstdcxx.
typename = val.type.name or val.type.tag or str(val.type)
match = re.match("^std::(__.*?)::", typename)
if match is None or match.group(1) in ["__cxx1998",
"__debug",
"__7",
"__g"]:
if match is not None and match.group(1) in ["__cxx1998",
"__debug",
"__7",
"__g"]:
return None
# Handle any using declarations or other typedefs.