We aren't talking about "S" here we are talking about "myInt" which is in the 
source code myInt::myInt(int) or _ZN5myIntC1Ei. That should be in the object 
file. 

cd lldb/test/functionalities/data-formatter/data-formatter-synthval
make
% dsymutil -s a.out | grep _ZN5myIntC1Ei
[    16] 0000010c 24 (N_FUN        ) 01     0000   0000000100000ee0 
'__ZN5myIntC1Ei'
[    33] 0000015f 1e (PEXT SECT    ) 01     0080   0000000100000ee0 
'__ZN5myIntC1Ei'

So the symbol is there for MacOSX with clang. Not there on other systems as it 
is _ZN3fooC2Ei

  <ctor-dtor-name> ::= C1       # complete object constructor
                   ::= C2       # base object constructor
                   ::= C3       # complete object allocating constructor
                   ::= D0       # deleting destructor
                   ::= D1       # complete object destructor
                   ::= D2       # base object destructor


So it looks like it has only the base object constructor (C2), not the 
"complete object constructor" (C1).

So the code looks like this:

class myInt {
    private: int theValue;
    public: myInt() : theValue(0) {}
    public: myInt(int _x) : theValue(_x) {}
    int val() { return theValue; }
};

class hasAnInt {
    public:
        myInt theInt;
        hasAnInt() : theInt(42) {}  
};

myInt operator + (myInt x, myInt y) { return myInt(x.val() + y.val()); }

int main() {
    myInt x{3};
    myInt y{4};
    myInt z {x+y};
    hasAnInt hi;
    return z.val(); // break here
}

This might be due to trying to use the initializer lists instead of using a 
default constructor. Luckily the expression we later try to run also uses the 
initializer lists:

self.expect("expression struct S { myInt theInt{12}; }; S()", substrs = 
['(theInt = 12)'])


The question is does this just work if we change the code to:

class myInt {
    private: int theValue;
    public: myInt() : theValue(0) {}
    public: myInt(int _x) : theValue(_x) {}
    int val() { return theValue; }
};

class hasAnInt {
    public:
        myInt theInt;
        hasAnInt() : theInt(42) {}  
};

myInt operator + (myInt x, myInt y) { return myInt(x.val() + y.val()); }

int main() {
    myInt x(3);
    myInt y(4);
    myInt z(x+y);
    hasAnInt hi;
    return z.val(); // break here
}

And the expression to be "expression struct S { myInt theInt(12); }; S()".

Maybe it will just work? 

If we do fix this test, we need to add a C++ test that fails that we can make a 
compiler fix for and mark as an expected fail.


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

Reply via email to