<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Apr 15, 2014 at 5:01 AM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div class="">On Mon, Apr 14, 2014 at 1:09 AM, suyog sarda <span dir="ltr"><<a href="mailto:sardask01@gmail.com" target="_blank">sardask01@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Richard,<div><br></div><div>Thanks for the review. I Agree to your explaination. Following are the points what i understood :</div>


<div><br></div><div>1. <span style="font-size:13px;font-family:arial,sans-serif">setInstantiatedFromMemberTempl</span><span style="font-size:13px;font-family:arial,sans-serif">ate call should not be skipped since it causes mix up of </span> <span style="font-family:arial,sans-serif;font-size:13px">template parameter list numbering and wrong substitutions, </span></div>



<div><span style="font-family:arial,sans-serif;font-size:13px">    which is clearly visible in the test case as well.</span></div></div></blockquote><div><br></div></div><div>More fundamentally, it shouldn't be skipped because this function is instantiated from a "member template" (it's not actually a member, but this really means class-scope template, not member template).</div>
<div class="">

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><span style="font-family:arial,sans-serif;font-size:13px">2. When C is instantiated twice, it should throw re-definition error of function f, which is not done (with or without my patch).</span></div>

</div></blockquote><div><br></div></div><div>That should be handled by the 'if (isFriend) {' loop starting at around line 1424.</div><div class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr">

<div><span style="font-family:arial,sans-serif;font-size:13px">3. In the same function call 'TemplateDeclInstantiator::VisitFunctionDecl', there is a check 'if (isFriend)'. </span></div><div><span style="font-family:arial,sans-serif;font-size:13px">    There is a standard described '[temp.friend] p4 (DR329)' inside that check, which checks if the <i>FunctionDecl D </i>is Declared as well as Defined (isThisDeclarationADefintion).</span></div>



<div><span style="font-family:arial,sans-serif;font-size:13px">    In my opinion, at this point the function defintion is not being set for friend function defined inside the class template. </span></div></div></blockquote>


<div><br></div></div><div>There's also something strange going on in VisitFunctionTemplateDecl -- that code is also calling setInstantiatedFromMemberTemplate for a friend template definition. So at least there appears to be some redundancy here.</div>
<div class="">
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><span style="font-family:arial,sans-serif;font-size:13px">4. While debugging, it is seen that, the </span><i style="font-family:arial,sans-serif;font-size:13px">FunctionDecl D </i><span style="font-family:arial,sans-serif;font-size:13px">is </span><i style="font-family:arial,sans-serif;font-size:13px">defined </i><span style="font-family:arial,sans-serif;font-size:13px">holds true but '</span><i style="font-family:arial,sans-serif;font-size:13px">Function->isDefined(Definition)</i><span style="font-family:arial,sans-serif;font-size:13px">' evaluates to false (I did not get why it evaluates to false),                 because of which re-defintion error is not emitted.</span></div>

</div></blockquote><div><br></div></div><div>The function isn't defined because we've not instantiated its definition yet; that's probably to be expected.</div></div></div></div></blockquote><div><br></div><div>
The whole point of conflict is happening because of this only - the function isn't defined because its not instantiated yet, because of which the call to function cannot find the definition, even though the definition should be independent to instantiation of class template.  <br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div><span style="font-family:arial,sans-serif;font-size:13px">There is a similar bug for operator overloading - Bug 14785. There also same case is happening - not able to identify if friend function (in 14785 its operator overloading function) is defined inside class template.</span></div>



<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">Can you please help me out if my above analysis is correct as well as indicate where/how to set the definition of the declared function? Your help is highly appreciated.  </span></div>

</div></blockquote><div><br></div></div><div>I don't get see what's going wrong, but I suspect something in FunctionDecl::getTemplateInstantiationPattern() is broken.</div></div></div></div></blockquote><div><br>
</div><div>I will look at this and try to see i can find something in it. (Though Use case wise its always better to define friend function outside the class.)<br></div></div><br><br clear="all"><br>-- <br>With regards,<br>
Suyog Sarda<br>
</div></div>