<div dir="ltr"><div dir="ltr" class="gmail_msg">Thank you for the reference Richard!</div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Sun, Feb 12, 2017 at 9:57 PM Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="gmail_msg" target="_blank">richard@metafoo.co.uk</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg">On 10 February 2017 at 05:34, Eric Liu via cfe-dev <span dir="ltr" class="gmail_msg"><<a href="mailto:cfe-dev@lists.llvm.org" class="gmail_msg" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="gmail_msg">Hi all,<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I have the following code:</div><div class="gmail_msg">```</div><div class="gmail_msg"><div class="gmail_msg">namespace a {                </div><div class="gmail_msg">class A {};                  </div><div class="gmail_msg">namespace b { class B { friend class A; };  }  // b                          </div><div class="gmail_msg">} // a                            </div></div><div class="gmail_msg">```</div><div class="gmail_msg">I expect that the friend "class A" refers to CXXRecordDecl "class <b class="gmail_msg">a::A</b>". However, it refers to an implicit CXXRecordDecl "class <b class="gmail_msg">a::b::A</b>" instead. Is this expected?</div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">Yes; that's how C++ works. The rule in question is in kind of an odd place (it's [namespace.memdef]p3) but is pretty clear:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">"If the name in a friend declaration is neither qualified nor a template-id and the declaration is a function or an elaborated-type-specifier, the lookup to determine whether the entity has been previously declared shall not consider any scopes outside the innermost enclosing namespace.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">It looks like MSVC does not properly implement this rule. I don't know whether Clang's MSVC compatibility mode emulates that bug.</div><div class="gmail_msg"> <br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"></blockquote></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_msg">* Node dump of the ElaboratedType "class A" in the friend declaration:<br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg">```</div><div class="gmail_msg">ElaboratedType 0x7fbf27d39570 'class A' sugar</div><div class="gmail_msg">`-RecordType 0x7fbf27d39540 'class a::b::A'</div><div class="gmail_msg">  `-CXXRecord 0x7fbf27d394a8 'A'</div></div><div class="gmail_msg">```</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">* AST dump:</div><div class="gmail_msg">```</div><div class="gmail_msg">....</div><div class="gmail_msg"><div class="gmail_msg">`-NamespaceDecl 0x7f1f79f4f050 </home/ioeric/llvm-build/test.cc:1:1, line:6:1> line:1:11 a</div><div class="gmail_msg">  |-CXXRecordDecl 0x7f1f79f4f0b8 <line:2:1, col:10> col:7 <b class="gmail_msg">class A</b> definition</div><div class="gmail_msg">  | `-CXXRecordDecl 0x7f1f79f4f1d0 <col:1, col:7> col:7 implicit class A</div><div class="gmail_msg">  `-NamespaceDecl 0x7f1f79f4f288 <line:3:1, line:5:1> line:3:11 b</div><div class="gmail_msg">    `-CXXRecordDecl 0x7f1f79f4f2f0 <line:4:1, col:27> col:7 class B definition</div><div class="gmail_msg">      |-CXXRecordDecl 0x7f1f79f4f410 <col:1, col:7> col:7 implicit class B</div><div class="gmail_msg">      `-FriendDecl 0x7f1f79f4f5c0 <col:11, col:24> col:18<b class="gmail_msg"> 'class A':'class a::b::A'</b></div></div><div class="gmail_msg">```</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Thanks,</div><div class="gmail_msg">Eric</div></div>
<br class="gmail_msg"></blockquote></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">_______________________________________________<br class="gmail_msg">
cfe-dev mailing list<br class="gmail_msg">
<a href="mailto:cfe-dev@lists.llvm.org" class="gmail_msg" target="_blank">cfe-dev@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br class="gmail_msg">
<br class="gmail_msg"></blockquote></div><br class="gmail_msg"></div></div>
</blockquote></div></div>