<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">2016-04-21 2:57 GMT+06:00 Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">rsmith added a comment.<br>
<br>
Sorry, I don't think this approach can work. Consider:<br>
<br>
  template<typename T> struct X {<br>
    template<typename U> friend void f(T);<br>
    template<typename U> friend void f(U);<br>
  };<br>
<br>
These two friend declarations declare different friend function templates, but this transformation would incorrectly make them have the same type and be redeclarations of each other.<br>
<br></blockquote><div> Yes, it's true, thank you for the example. I think dependent friend template functions should not be added into redeclaration chains.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I think the right thing here is to just accept that a friend function template declared within a class template will not be part of the corresponding redeclaration chain. But that's fine, so long as we don't try to inject the function template into the surrounding scope -- when we come to instantiate the class template, the instantiated friend function template will have the right type and will be part of the relevant redeclaration chain.<br>
<br></blockquote><div><div>Redeclaration chain of templates are useful for checking semantics of templates, not instantiated entities, which have own redeclaration chains. Particular task for which this fix should be useful is implementation of default template arguments of friend functions. Now clang do not allow to specify them, but the standard allow [temp.parap]p9 : "... If a friend function template declaration specifies a default template-argument, that declaration shall be a definition and shall be the only declaration of the function template in the translation unit". The mentioned condition could be checked using redeclaration chain of templates, if the chain was built correctly.</div><div><br></div><div>The main problem related to the redeclaration chains is similar to that solved by <a href="http://reviews.llvm.org/D16989">http://reviews.llvm.org/D16989</a>. Clang and GCC now treat friend function definitions differently. The following code:</div><div><br></div></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><div>template<typename T1> void func();</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div><br></div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>template<typename T></div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>struct C1 {</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>  template<typename T1> friend void func() {}</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>};</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div><br></div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>int main(int argc, char *argv[]) {</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>  func<int>();</div></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><div>}</div></div></div></div></blockquote><div class="gmail_extra"><div class="gmail_quote"><div><div><br></div><div>produces error at link stage if GCC is used, due to unresolved reference to func<int>().  Clang compiles this code successfully, it sees the definition of func inside struct C1. GCC sees it only if host template is instantiated.</div><div><br></div><div>It makes sense to finish <a href="http://reviews.llvm.org/D16989">http://reviews.llvm.org/D16989</a> first. Many of problems related to not-template friend functions seem to be applicable to templates as well.</div></div><div><br></div><div>Thanks,</div><div>--Serge</div><div><br></div></div></div></div><div id="DDB4FAA8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br> <table style="border-top:1px solid #aaabb6">
        <tr>
      <td style="width:55px;padding-top:18px"><a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail" target="_blank"><img src="https://ipmcdn.avast.com/images/2016/icons/icon-envelope-tick-round-orange-v1.png"></a></td>
                <td style="width:470px;padding-top:20px;color:#41424e;font-size:13px;font-family:Arial,Helvetica,sans-serif;line-height:18px">Без вирусов. <a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail" target="_blank" style="color:#4453ea">www.avast.com</a>                </td>
        </tr>
</table>
<a href="#DDB4FAA8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"></a></div>