<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi LLVM people,<div><br></div><div>I am new to clang/llvm and have been hacking on it for about three weeks now.  I am trying to implement compound assignment operators, +=, -=, and *=, for matrices. Here are the bug <a href="https://bugs.llvm.org/show_bug.cgi?id=46164">details</a>.</div><div><br></div><div>I have a lit test that tries to do a "a += b" for matrices a and b. Here's its <a href="https://godbolt.org/z/eM7x1q">trace</a>  (courtesy Florian Hahn). Clang fails on this <a href="https://github.com/llvm/llvm-project/blob/ca5247bb1770a1dfa56b78303d99f1cc9a0a06ee/clang/include/clang/AST/Type.h#L677">assertion</a>. And this is because when we do a static cast from a Stmt instance to a CompoundAssignOperator <a href="https://github.com/llvm/llvm-project/blob/ca5247bb1770a1dfa56b78303d99f1cc9a0a06ee/clang/include/clang/AST/StmtVisitor.h#L76">here</a>, we are not assigning the correct QualType to the LHS. Concretely, here's what I found in my debugging.</div><div dir="ltr"><br></div># printing out S<br>(lldb) p S<br>(std::__add_pointer_helper<clang::Stmt, true>::type) $0 = 0x0000000011621f70<br><br></div><div># cast S to CompoundAssignOperator</div><div dir="ltr">(lldb) p ((CompoundAssignOperator *) S)<br>(clang::CompoundAssignOperator *) $1 = 0x0000000011621f70<br><br></div><div># access ComputationLHSType attribute of casted S. The QualType is NULL.</div><div dir="ltr">(lldb) p ((CompoundAssignOperator *) S)->ComputationLHSType<br>(clang::QualType) $2 = {<br>  Value = (Value = 0)<br>}<br><br></div><div># access ComputationResultType attribute of casted S.</div><div dir="ltr">(lldb) p ((CompoundAssignOperator *) S)->ComputationResultType<br>(clang::QualType) $3 = {<br>  Value = (Value = 291641504)<br>}<br><br>So I think it's working correctly for ComputationResultType but is somehow assigning null to ComputationLHSType's QualType.Value. This is interesting because if I try to cast S to something like BinaryOperator and cast its operands to Expr, the types are coming out correctly.</div><div dir="ltr"><br></div><div># Cast S to BinaryOperator</div>(lldb) p ((BinaryOperator *) S)<br>(clang::BinaryOperator *) $9 = 0x0000000011621f70</div><div dir="ltr"><br></div><div># Cast first operand to Expr and get its type.</div>(lldb) p ((Expr *) ((BinaryOperator *) S)->SubExprs[0])->TR<br>(clang::QualType) $13 = {<br>  Value = (Value = 291641504)<br>}<br><br># Cast second operand to Expr and get its type.<br>(lldb) p ((Expr *) ((BinaryOperator *) S)->SubExprs[1])->TR<br>(clang::QualType) $14 = {<br>  Value = (Value = 291641504)<br>}</div><div dir="ltr"><br></div><div>I suspect that these static casts to children classes are connected to the traversal of AST where classes of child nodes are in the inheritance hierarchy of the class of the parent. What I am trying to understand though is the mechanics of these casting. What do I need to look at in order to do that Stmt -> CompoundAssignOperator correctly. I was going through the static_cast C++ <a href="https://en.cppreference.com/w/cpp/language/static_cast">reference doc</a> but I suspect that I am missing something specific to the codebase.</div><div><br></div><div>Does anyone have any thoughts on where I can go from here?</div><div><br></div><div>Many thanks,</div><div>Saurabh</div></div></div></div></div></div></div></div>