Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lldb/source/Target/StackFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,7 @@ ValueObjectSP StackFrame::DILGetValueForVariableExpressionPath(
return ValueObjectConstResult::Create(nullptr, std::move(error));
}

var_sp = (*valobj_or_error)->GetVariable();
return *valobj_or_error;
}

Expand Down
10 changes: 5 additions & 5 deletions lldb/source/ValueObject/DILEval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -363,8 +363,8 @@ Interpreter::Visit(const MemberOfNode *node) {

if (!m_use_synthetic || !field_obj) {
std::string errMsg = llvm::formatv(
"no member named '{0}' in {1}", node->GetFieldName(),
base->GetCompilerType().GetFullyUnqualifiedType().TypeDescription());
"\"{0}\" is not a member of \"({1}) {2}\"", node->GetFieldName(),
base->GetTypeName().AsCString("<invalid type>"), base->GetName());
return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, node->GetLocation(), node->GetFieldName().size());
}
Expand All @@ -383,9 +383,9 @@ Interpreter::Visit(const MemberOfNode *node) {
CompilerType base_type = base->GetCompilerType();
if (node->GetIsArrow() && base->IsPointerType())
base_type = base_type.GetPointeeType();
std::string errMsg =
llvm::formatv("no member named '{0}' in {1}", node->GetFieldName(),
base_type.GetFullyUnqualifiedType().TypeDescription());
std::string errMsg = llvm::formatv(
"\"{0}\" is not a member of \"({1}) {2}\"", node->GetFieldName(),
base->GetTypeName().AsCString("<invalid type>"), base->GetName());
return llvm::make_error<DILDiagnosticError>(
m_expr, errMsg, node->GetLocation(), node->GetFieldName().size());
}
Expand Down
42 changes: 29 additions & 13 deletions lldb/source/ValueObject/DILParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,12 +191,28 @@ ASTNodeUP DILParser::ParsePrimaryExpression() {
return std::make_unique<IdentifierNode>(loc, identifier);
}

uint32_t loc = CurToken().GetLocation();
std::string nested_name_specifier;

if (CurToken().Is(Token::l_paren)) {
m_dil_lexer.Advance();
auto expr = ParseExpression();
Expect(Token::r_paren);
m_dil_lexer.Advance();
return expr;
nested_name_specifier = ParseNestedNameSpecifier();

if (!nested_name_specifier.empty()) {
if (!CurToken().Is(Token::identifier)) {
BailOut("Expected an identifier, but not found.",
CurToken().GetLocation(), CurToken().GetSpelling().length());
}

std::string unqualified_id = ParseUnqualifiedId();
return std::make_unique<IdentifierNode>(loc, nested_name_specifier +
unqualified_id);
} else {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no else after return

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

m_dil_lexer.Advance();
auto expr = ParseExpression();
Expect(Token::r_paren);
m_dil_lexer.Advance();
return expr;
}
}

BailOut(llvm::formatv("Unexpected token: {0}", CurToken()),
Expand Down Expand Up @@ -232,16 +248,16 @@ std::string DILParser::ParseNestedNameSpecifier() {
m_dil_lexer.LookAhead(4).Is(Token::coloncolon)) {
m_dil_lexer.Advance(4);

assert(
(CurToken().Is(Token::identifier) || CurToken().Is(Token::l_paren)) &&
"Expected an identifier or anonymous namespace, but not found.");
Expect(Token::coloncolon);
m_dil_lexer.Advance();
if (!CurToken().Is(Token::identifier) && !CurToken().Is(Token::l_paren)) {
BailOut(
"Expected an identifier or anonymous namespeace, but not found.",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

namespace

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

CurToken().GetLocation(), CurToken().GetSpelling().length());
}
// Continue parsing the nested_namespace_specifier.
std::string identifier2 = ParseNestedNameSpecifier();
if (identifier2.empty()) {
Expect(Token::identifier);
identifier2 = CurToken().GetSpelling();
m_dil_lexer.Advance();
}

return "(anonymous namespace)::" + identifier2;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,19 @@ def test_frame_var(self):
self.expect_var_path("sp->x", value="1")
self.expect_var_path("sp->r", type="int &")

self.expect("frame variable 'sp->foo'", error=True,
substrs=["no member named 'foo' in 'Sx *'"])

self.expect("frame variable 'sp.x'", error=True,
substrs=["member reference type 'Sx *' is a "
"pointer; did you mean to use '->'"])
self.expect(
"frame variable 'sp->foo'",
error=True,
substrs=['"foo" is not a member of "(Sx *) sp"'],
)

self.expect(
"frame variable 'sp.x'",
error=True,
substrs=[
"member reference type 'Sx *' is a pointer; did you mean to use '->'"
],
)

# Test for record typedefs.
self.expect_var_path("sa.x", value="3")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ def test_frame_var(self):
self.expect_var_path("a.x", value="1")
self.expect_var_path("a.y", value="2")

self.expect("frame variable 'b.x'", error=True,
substrs=["no member named 'x' in 'B'"])
self.expect(
"frame variable 'b.x'",
error=True,
substrs=['"x" is not a member of "(B) b"'],
)
#self.expect_var_path("b.y", value="0")
self.expect_var_path("b.z", value="3")
self.expect_var_path("b.w", value="4")
Expand All @@ -43,19 +46,31 @@ def test_frame_var(self):
self.expect_var_path("d.z", value="9")
self.expect_var_path("d.w", value="10")

self.expect("frame variable 'e.x'", error=True,
substrs=["no member named 'x' in 'E'"])
self.expect("frame variable 'f.x'", error=True,
substrs=["no member named 'x' in 'F'"])
self.expect(
"frame variable 'e.x'",
error=True,
substrs=['"x" is not a member of "(E) e"'],
)
self.expect(
"frame variable 'f.x'",
error=True,
substrs=['"x" is not a member of "(F) f"'],
)
self.expect_var_path("f.named_field.x", value="12")

self.expect_var_path("unnamed_derived.y", value="2")
self.expect_var_path("unnamed_derived.z", value="13")

self.expect("frame variable 'derb.x'", error=True,
substrs=["no member named 'x' in 'DerivedB'"])
self.expect("frame variable 'derb.y'", error=True,
substrs=["no member named 'y' in 'DerivedB'"])
self.expect(
"frame variable 'derb.x'",
error=True,
substrs=['"x" is not a member of "(DerivedB) derb"'],
)
self.expect(
"frame variable 'derb.y'",
error=True,
substrs=['"y" is not a member of "(DerivedB) derb"'],
)
self.expect_var_path("derb.w", value="14")
self.expect_var_path("derb.k", value="15")
self.expect_var_path("derb.a.x", value="1")
Expand Down
Loading