<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 10 February 2017 at 05:34, Eric Liu via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi all,<div><br></div><div>I have the following code:</div><div>```</div><div><div>namespace a {                </div><div>class A {};                  </div><div>namespace b { class B { friend class A; };  }  // b                          </div><div>} // a                            </div></div><div>```</div><div>I expect that the friend "class A" refers to CXXRecordDecl "class <b>a::A</b>". However, it refers to an implicit CXXRecordDecl "class <b>a::b::A</b>" instead. Is this expected?</div></div></blockquote><div><br></div><div>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><br></div><div>"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><br></div><div>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> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>* Node dump of the ElaboratedType "class A" in the friend declaration:<br></div><div><div>```</div><div>ElaboratedType 0x7fbf27d39570 'class A' sugar</div><div>`-RecordType 0x7fbf27d39540 'class a::b::A'</div><div>  `-CXXRecord 0x7fbf27d394a8 'A'</div></div><div>```</div><div><br></div><div>* AST dump:</div><div>```</div><div>....</div><div><div>`-NamespaceDecl 0x7f1f79f4f050 </home/ioeric/llvm-build/test.<wbr>cc:1:1, line:6:1> line:1:11 a</div><div>  |-CXXRecordDecl 0x7f1f79f4f0b8 <line:2:1, col:10> col:7 <b>class A</b> definition</div><div>  | `-CXXRecordDecl 0x7f1f79f4f1d0 <col:1, col:7> col:7 implicit class A</div><div>  `-NamespaceDecl 0x7f1f79f4f288 <line:3:1, line:5:1> line:3:11 b</div><div>    `-CXXRecordDecl 0x7f1f79f4f2f0 <line:4:1, col:27> col:7 class B definition</div><div>      |-CXXRecordDecl 0x7f1f79f4f410 <col:1, col:7> col:7 implicit class B</div><div>      `-FriendDecl 0x7f1f79f4f5c0 <col:11, col:24> col:18<b> 'class A':'class a::b::A'</b></div></div><div>```</div><div><br></div><div>Thanks,</div><div>Eric</div></div>
<br>______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div>