================
@@ -339,6 +463,40 @@ std::string DILParser::ParseUnqualifiedId() {
return identifier;
}
+CompilerType
+DILParser::ResolveTypeDeclarators(CompilerType type,
+ const std::vector<Token> &ptr_operators) {
+ CompilerType bad_type;
+ // Resolve pointers/references.
+ for (Token tk : ptr_operators) {
+ uint32_t loc = tk.GetLocation();
+ if (tk.GetKind() == Token::star) {
+ // Pointers to reference types are forbidden.
+ if (type.IsReferenceType()) {
+ BailOut(llvm::formatv("'type name' declared as a pointer to a "
+ "reference of type {0}",
+ type.TypeDescription()),
+ loc, CurToken().GetSpelling().length());
+ return bad_type;
+ }
----------------
kuilpd wrote:
> > But in general, this is a C-style cast with C-style syntax, I think it
> > should be expected to be used only with C/C++ code, since DIL will be
> > mostly used automatically without the programmer knowing that DIL will try
> > to evaluate the expression before the compiler.
> But isn't DIL supposed to be the de-facto inspection language? Regardless of
> what language you're debugging. Yes it follows mostly C/C++ syntax but here
> you are checking explicitly C++ language semantics, not just syntax.
> It is the intention of the DIL to be the general introspection language. We
> should try to make it useable to people who aren't just debugging C but the
> overall idea is that most people are familiar with C so making the syntax
> look C-ish is a good way to achieve that goal. Remember that this is not the
> expression parser, whose job it is to capture all the subtleties of any given
> language. This is primarily a way to examine data values.
@Michael137 @jimingham
What I meant to say is that considering how we're integrating DIL into LLDB,
most people won't even know that DIL exists. We just replaced the
implementation of `frame var` with DIL and made people use it without realizing
it. And this implementation is used as a first attempt in evaluating
expressions when using an IDE via lldb-dap (for example), so people will be
just writing expressions in the language that they're debugging.
So, on the one hand, what's the point going out of the way supporting C-style
cast on languages with different reference symbol, or no explicit references at
all (like Swift, if I understand correctly)? For someone to do this, they would
need to know about DIL and to know that it is allowed to replace a reference
symbol `&` with something else specifically in a C-style cast. On the other
hand, the debugged code could be a mixture of C++ and Swift objects, so maybe
this could be useful to have anyway. I'm really not sure, I thought we could
eventually just support different syntax constructions from different languages
which underneath could do the same thing, or at least very similar ones. For
example, having both a C-style cast and a keyword `as` for Swift and Rust,
which is why I also suggested to keep the name "CStyleCastNode" in the code.
This hasn't really come up in any meetings about DIL afaik, so maybe we need to
discuss this at some point.
But for now it's probably a good idea anyway to check pointer/reference
operators during evaluation, although disallowing reference to pointer and
reference to reference is exclusive to this cast. Normally, we can do that, so
existing type system functions like `GetPointerType` won't work here.
https://github.com/llvm/llvm-project/pull/165199
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits