Michael137 wrote:

> How do we explain that for my global variable `class`,
> 
> (lldb) expr class = 110
> 
> works when I happen to be stopped in a C frame, but if I can't find a C frame 
> around there's no way I can replicate that behavior?

> How do we explain that for my global variable `class`,
> 
> 
> 
> (lldb) expr class = 110
> 
> 
> 
> works when I happen to be stopped in a C frame, but if I can't find a C frame 
> around there's no way I can replicate that behavior?

Good question. The reason it works for your example when stopped in a C frame 
is that the Clang expression evaluator has a workaround in it to allow C++ 
keywords in pure C/ObjC expressions. If the frame (or before this patch the 
`--language` flag was C/ObjC), we explicitly "unmark" the reserved C++ keywords 
here:
https://github.com/llvm/llvm-project/blob/cc365331af423de99ae98655d035e4892842fe97/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp#L848-L861

But that in itself still has a workaround to make C-expressions work (because 
we rely on `using` to capture local variables)
```
static void RemoveCppKeyword(IdentifierTable &idents, llvm::StringRef token) {
  // FIXME: 'using' is used by LLDB for local variables, so we can't remove
  // this keyword without breaking this functionality.
  if (token == "using")
    return;
```

But we're still lying to the user about this being pure C expression 
evaluation. All-in-all, in my opinion, it would be best to keep this workaround 
contained to just expression evaluation from C/ObjC-frames. If we're stopped in 
a context where these identifiers were used as variable names, presumably that 
frame must be a language where this was allowed in. So we would still support 
the majority of use-cases.

The only scenario I can think of that this breaks is that if we're stopped in a 
C-frame, then declare a top-level variable in the expression context with a 
reserved identifier in the name, and then switch to a C++ frame and try to use 
it:

```
frame #3: 0x000000010000046c a.out`func at lib.c:2:14                           
                          
   1     #include <stdlib.h>             
-> 2    int func() { abort(); }                                                 
                          
(lldb) expr --top-level -- int namespace = 10;                                  
                          
(lldb) expr namespace                                
(int) $0 = 10                                                                   
                          
(lldb) up                                                                       
                          
frame #4: 0x0000000100000454 a.out`main at main.cpp:6:5
   1    extern "C" {                                 
   2    int func();       
   3    }                                                                       
                          
   4                
   5    int main() {
-> 6        func();
   7    }
(lldb) expr namespace
            ˄      
            ╰─ error: expected identifier or '{'
(lldb) down          
```

Is that a scenario we want to support?


https://github.com/llvm/llvm-project/pull/156648
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to