Thanks<br><br>Sergey<br><br><div class="gmail_quote">5 Á×ÇÕÓÔÁ 2010šÇ. 14:17 ÐÏÌØÚÏ×ÁÔÅÌØ Douglas Gregor <span dir="ltr"><<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>></span> ÎÁÐÉÓÁÌ:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im"><br>
On Aug 5, 2010, at 12:04 PM, óÅÒÇÅÊ æÉÌÉÐÐÏ× wrote:<br>
<br>
> Hi,<br>
> I'm facing strange bug with Rewriter::InsertText.<br>
> Here is the code:<br>
><br>
> void RewritingPass::Initialize(ASTContext &context)<br>
> {<br>
> š š this->context = &context;<br>
> š š SourceLocation L;<br>
> š š mainFileId = context.getSourceManager().getMainFileID();<br>
> š š rewriter = new Rewriter(context.getSourceManager(), context.getLangOptions());<br>
> š š const llvm::StringRef preamble(getPreamble());<br>
> š š if (preamble.size() > 0)<br>
> š š š š rewriter->InsertText(context.getSourceManager().getLocForStartOfFile(mainFileId), preamble, true);<br>
> }<br>
<br>
<br>
</div>StringRef is a reference to a string that exists somewhere in memory; it doesn't copy the contents of the string. In this case, getPreamble() returns a temporary, and the preamble StringRef refers to that temporary's storage. When the temporary is destroyed, the storage goes away... and you get strange behavior. Capture the result of getPreamble() in a local string, then pass that along to InsertText.<br>

<br>
It's generally not a good idea to have a StringRef variable.<br>
<br>
 š š š š- Doug</blockquote></div><br>