<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<p></p>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px; margin-top: 0px; margin-bottom: 0px;">
Hi Miklos,</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px; margin-top: 0px; margin-bottom: 0px;">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px; margin-top: 0px; margin-bottom: 0px;">
Yes, I tried getUnderlyingType(). Here is the code I have:</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px; margin-top: 0px; margin-bottom: 0px;">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px; margin-top: 0px; margin-bottom: 0px;">
 </div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
void iterateTypeFields(const clang::Type* type)</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
{</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    clang::RecordDecl* recordDecl;</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    if (auto* typedefType = llvm::dyn_cast<clang::TypedefType>(type)) {</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        typedefType->getDecl()->getUnderlyingType()->dump();</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        iterateTypeFields(&*typedefType->getDecl()->getUnderlyingType());</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    } else if (auto* elaboratedType = llvm::dyn_cast<clang::ElaboratedType>(type)) {</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        elaboratedType->getNamedType()->dump();</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        iterateTypeFields(&*elaboratedType->getNamedType());</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
 </div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    } else if (auto* recordType = llvm::dyn_cast<clang::RecordType>(type)) {</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        recordType->dump();</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        recordDecl = recordType->getDecl()->getDefinition();</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    } else if (type->isStructureType()) {</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        recordDecl = type->getAsStructureType()->getDecl();</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    } else {</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
        return;</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    }</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    int i  = 0;</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    for (auto it = recordDecl->field_begin(); it != recordDecl->field_end(); ++it) {</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
          // Do stuff</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
 </div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
    }</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
}</div>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
<br>
</div>
<span style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">When this code is ran on the example I posted, first I get TypedefType, then its' underlying type is ElaboratedType which getNamedType is the RecordType. So this function
 is called with TypedefType, then ElaboratedType then RecordType. However when I try to call field_begin function on RecordDecl obtained from RecordType it crashes in clang sources. That's why I'm assuming that I'm doing something wrong here. </span>
<div style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px; margin-top: 0px; margin-bottom: 0px;">
 </div>
<br style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">
<span style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont; font-size: 16px;">Thanks!</span><br>
<p></p>
<br>
<br>
<div style="color:rgb(0,0,0)">
<div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Miklos Vajna <vmiklos@vmiklos.hu><br>
<b>Sent:</b> Wednesday, February 6, 2019 9:46 AM<br>
<b>To:</b> Hayrapetyan, Anahit<br>
<b>Cc:</b> cfe-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [cfe-dev] Iterate over struct's fields</font>
<div> </div>
</div>
</div>
<font size="2"><span style="font-size:10pt">
<div class="PlainText">Hi,<br>
<br>
On Tue, Feb 05, 2019 at 08:38:36PM +0000, "Hayrapetyan, Anahit via cfe-dev" <cfe-dev@lists.llvm.org> wrote:<br>
>  How can I get the real RecordDecl, the one that also has FieldDecls for struct?<br>
<br>
Did you try getUnderlyingType()? See<br>
<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html" id="LPlnk489397" previewremoved="true">http://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html</a>>.<br>
<br>
Regards,<br>
<br>
Miklos<br>
</div>
</span></font></div>
</div>
</body>
</html>