On Wed, Sep 5, 2012 at 4:08 PM, Sergiy Migdalskiy <span dir="ltr"><<a href="mailto:migdalskiy@hotmail.com" target="_blank">migdalskiy@hotmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">
<div dir="ltr">
<div style="font-size:12pt;font-family:'Calibri'">
<div>Hello,</div>
<div>†</div>
<div>I just implemented my first function in libclang Ė it gets a field cursor 
and returns the bitfield width, if thatís a bitfield. Otherwise it returns a 
negative value.</div>
<div>†</div>
<div>Iíd like to submit it as a patch (never did that before, Iíll read up on 
how to do that later), but first can someone review this routine? It seems to 
work, but having never written anything inside clang (and having played with 
clang for only a couple of weeks now), I suspect there may just be half a dozen 
bugs there. In any case, I hope itíll be helpful at least for some people 
reading this list.</div>
<div>†</div>
<div>And by the way, kudos to all Clang developers for the high quality product. 
The code (at least the bits I looked at when implementing this) is a delight to 
read.</div>
<div>†</div>
<div>†</div>
<div>// -1 : cursor is not a field declaration</div>
<div>// -2 : cursor is not a bitfield declaration</div>
<div>// -3 : could not evaluate the bitfield width</div>
<div>int clang_Cursor_getBitfieldWidth(CXCursor C) {</div>
<div>† if (clang_isDeclaration(C.kind)) {</div>
<div>††† Decl *D = cxcursor::getCursorDecl(C);</div>
<div>††† if( const FieldDecl *FD = dyn_cast_or_null< FieldDecl 
>(D) ){</div>
<div>††††† Expr *pBitWidth = 
FD->getBitWidth();</div>
<div>††††† if( pBitWidth ){</div>
<div>††††††† llvm::APSInt width;</div>
<div>††††††† if( 
pBitWidth->EvaluateAsInt(width, getCursorASTUnit(C)->getASTContext() ) 
){</div>
<div>††††††††† return 
*width.getRawData();</div>
<div>††††††† }</div></div></div></div></blockquote><div><br></div><div>You should use FD->getBitWidthValue(ASTContext) to get the width. Before that call, you should also bail out with an error if pBitWidth->isValueDependent().</div>
</div>