valobj.AddressOf() returns None when an address is expected in a SyntheticChildrenProvider Patch from Enrico Granata: The problem was that the frozen object created by the expression parser was a copy of the contents of the StgClosure, rather than a pointer to it. Thus, the expression parser was correctly computing the result of the arithmetic&cast operation along with its address, but only saving it in the live object. This meant that the frozen copy acted as an address-less variable, hence the problem. The fix attached to this email lets the expression parser store the "live address" in the frozen copy of the address when the object is built without a valid address of its own. Doing so, along with delegating ValueObjectConstResult to calculate its own address when necessary, solves the issue. I have also added a new test case to check for regressions in this area, and checked that existing test cases pass correctly. llvm-svn: 146768
55 lines
728 B
C++
55 lines
728 B
C++
//
|
|
// 11588.cpp
|
|
//
|
|
|
|
#include <iostream>
|
|
|
|
class StgInfoTable {};
|
|
|
|
class StgHeader
|
|
{
|
|
private:
|
|
StgInfoTable* info;
|
|
public:
|
|
StgHeader()
|
|
{
|
|
info = new StgInfoTable();
|
|
}
|
|
~StgHeader()
|
|
{
|
|
delete info;
|
|
}
|
|
};
|
|
|
|
class StgClosure
|
|
{
|
|
private:
|
|
StgHeader header;
|
|
StgClosure* payload[1];
|
|
public:
|
|
StgClosure(bool make_payload = true)
|
|
{
|
|
if (make_payload)
|
|
payload[0] = new StgClosure(false);
|
|
else
|
|
payload[0] = NULL;
|
|
}
|
|
~StgClosure()
|
|
{
|
|
if (payload[0])
|
|
delete payload[0];
|
|
}
|
|
};
|
|
|
|
typedef unsigned long long int ptr_type;
|
|
|
|
int main()
|
|
{
|
|
StgClosure* r14_ = new StgClosure();
|
|
r14_ = (StgClosure*)(((ptr_type)r14_ | 0x01)); // set the LSB to 1 for tagging
|
|
ptr_type r14 = (ptr_type)r14_;
|
|
int x = 0;
|
|
x = 3;
|
|
return (x-1);
|
|
}
|