<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 9, 2014 at 12:00 AM, Jiangning Liu <span dir="ltr"><<a href="mailto:liujiangning1@gmail.com" target="_blank">liujiangning1@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"><div>Hi,</div><div><br></div><div>I have a class forwarding definition issue. For the following small test case, gcc can build pass, but clang(trunk) will build fail.</div><div><br></div><div>====================================</div><div><br></div><div>template<class T> class B;</div><div><br></div><div>template<class T></div><div>class A</div><div>{</div><div>  public:</div><div>    void f(void) const { B<double> e; g(e); }</div><div>    void g(B<double> &e) const;</div><div>};</div><div><br></div><div>template<class T></div><div>class B</div><div>{</div><div>public:</div><div>  T x[9];</div><div><br></div><div>  B() {</div><div>    for(int i=0;i<9;i++) x[i]=0;</div><div>  }</div><div>};</div><div>$ g++ -std=c++03 -c tt.cc</div><div>$ clang++ -std=c++03 -c tt.cc</div><div>tt.cc:7:36: error: implicit instantiation of undefined template 'B<double>'</div><div>    void f(void) const { B<double> e; g(e); }</div><div>                                   ^</div><div>tt.cc:1:25: note: template is declared here</div><div>template<class T> class B;</div><div>                        ^</div><div>1 error generated.</div><div><br></div><div><div>====================================</div></div><div><br></div><div>Is this bug in clang?</div><div><br></div><div>If not, how should I write the forwarding declaration for class B, and why gcc can pass?</div></div></blockquote><div><br></div><div>This is one of those cases where a compiler isn't required to diagnose the fact that your program is invalid (the standard wording is "invalid, no diagnostic required").<br><br>The particular issue is that B<double> is not a dependent name - so the compiler can resolve it at template (A<T>) declaration time, without having to wait for an instantiation to realize that B<double> is not defined.<br><br>That's my understanding at least.</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><br></div><div>Thanks,</div><div>-Jiangning</div></div>
<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div>