I think for the purposes of expression evaluation, it would be OK to treat C and C++ as being the same language, and just worry about C/C++ vs other languages (ObjC, and in future perhaps Go/D/etc)

Richard Mitton
[email protected]

On 10/03/2013 05:16 PM, Sean Callanan wrote:
Richard,

thanks for having a look at this!

I completely agree that this should happen.  However, there are currently 
several reasons why making the change you suggest will be hard.

1. SymbolFileDWARF generates CXXRecordDecls for every record declaration.  This 
is because, in C++, Clang expects all records to use the CXXRecordDecl data 
structure.  In C, we would have to use plain RecordDecls because Clang in C 
mode expects that.  I’m not sure the type system would take kindly to having 
different versions of the same type for C and C++ mode; we’d probably have to 
have duplicate ClangASTContexts, one in C mode and one in C++ mode.

2. The expression parser itself relies heavily on the C++ reference type for 
its operation.  The reason you can type “a + b” and have accesses to these 
relayed as if through a pointer to the versions of a and b in your program is 
because LLDB uses C++ references behind the scenes.  We do not want people to 
have to explicitly dereference pointers or anything like that.

The most likely (to my mind!  a Clang developer might have different opinions 
here :) ) solution to this will probably involve changing Clang itself to allow 
parsing with C syntax but with C++ semantics under the hood.

If you’re still interested in digging into making this work purely on LLDB’s 
side, I’d be very excited to see what solutions you come up with.  But be aware 
that this is much harder than just passing the right language options in the 
right place.

Sean

On Oct 3, 2013, at 5:00 PM, Richard Mitton <[email protected]> wrote:

Hi all,

The following code fails when asking lldb to run the command "(lldb) expr id"
    int main() {
        int id = 4;
        return 0;
    }

The reason is because lldb tries to evaluate the expression as Objective C++, rather than 
C. And in Objective C++, "id" is a builtin type, and so conflicts with our 
local variable.

I'm thinking the correct fix is to evaluate expressions in the language of the 
current scope, but I just wanted to throw this out there and check before I go 
off and try to fix it.

One possible problem of using the current scope's language is that if you had a 
program that mixed languages (e.g. C++ and ObjC in different files), you 
wouldn't be able to evaluate any ObjC expressions while you were in a C++ 
function.

--
Richard Mitton
[email protected]

_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev


_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to