My intuition was that the USRs would be different, that linkage would either be included or not included from the USR, but it wouldn't affect whether the namespace is included. (Reasoning: USRs model language concepts, not linker ones)
But we're both wrong. If I'm reading USRGeneration correctly, hitting a linkage spec while walking the scope tree sets the "ignore result" flag which signals the result is unusable (and short-circuits some paths that finish computing it). This seems like it may cause problems for us :-) I wonder why the tests didn't catch it, maybe I'm misreading. On Fri, Feb 2, 2018 at 1:46 PM, Ilya Biryukov <ibiryu...@google.com> wrote: > Exactly. We should make sure we *don't* treat them as the same symbol. But > I would expect there USRs to be the same and that's what we use to > deduplicate. > > > On Fri, Feb 2, 2018 at 1:45 PM Sam McCall <sammcc...@google.com> wrote: > >> Right. And multiple TUs that *are* linked together would be fine too. >> But in that case I don't think we need to be clever about treating these >> as the same symbol. Indexing them twice is fine. >> >> On Fri, Feb 2, 2018 at 1:42 PM, Ilya Biryukov <ibiryu...@google.com> >> wrote: >> >>> In a single translation unit, yes. In multiple translation units that >>> aren't linked together it's totally fine (may actually refer to different >>> entities). >>> >>> >>> On Fri, Feb 2, 2018 at 1:04 PM Sam McCall <sammcc...@google.com> wrote: >>> >>>> Yeah this is just a bug in clang's pprinter. I'll fix it. >>>> >>>> If you give multiple C++ names to the same linker symbol using extern >>>> C, I'm pretty sure you're in UB land. >>>> >>>> On Fri, Feb 2, 2018, 12:04 Ilya Biryukov via Phabricator < >>>> revi...@reviews.llvm.org> wrote: >>>> >>>>> ilya-biryukov added inline comments. >>>>> >>>>> >>>>> ================ >>>>> Comment at: clangd/index/SymbolCollector.cpp:73 >>>>> + Context = Context->getParent()) { >>>>> + if (llvm::isa<TranslationUnitDecl>(Context) || >>>>> + llvm::isa<LinkageSpecDecl>(Context)) >>>>> ---------------- >>>>> ioeric wrote: >>>>> > sammccall wrote: >>>>> > > I'm not sure this is always correct: at least clang accepts this >>>>> code: >>>>> > > >>>>> > > namespace X { extern "C++" { int y; }} >>>>> > > >>>>> > > and you'll emit "y" instead of "X::y". >>>>> > > >>>>> > > I think the check you want is >>>>> > > >>>>> > > if (Context->isTransparentContext() || >>>>> Context->isInlineNamespace()) >>>>> > > continue; >>>>> > > >>>>> > > isTransparentContext will handle the Namespace and Enum cases as >>>>> you do below, including the enum/enum class distinction. >>>>> > > >>>>> > > (The code you have below is otherwise correct, I think - but a >>>>> reader needs to think about more separate cases in order to see that) >>>>> > In `namespace X { extern "C++" { int y; }}`, we would still want `y` >>>>> instead of `X::y` since C-style symbol doesn't have scope. >>>>> `printQualifiedName` also does the same thing printing `y`; I've added a >>>>> test case for `extern C`. >>>>> > >>>>> > I also realized we've been dropping C symbols in `shouldFilterDecl` >>>>> and fixed it in the same patch. >>>>> I think we want `X::y`, not `y`. >>>>> >>>>> Lookup still finds it inside the namespace and does not find it in the >>>>> global scope. So for our purposes they are actually inside the namespace >>>>> and have the qualified name of this namespace. Here's an example: >>>>> ``` >>>>> namespace ns { >>>>> extern "C" int foo(); >>>>> } >>>>> >>>>> void test() { >>>>> ns::foo(); // ok >>>>> foo(); // error >>>>> ::foo(); // error >>>>> } >>>>> ``` >>>>> >>>>> Note, however, that the tricky bit there is probably merging of the >>>>> symbols, as it means symbols with the same USR (they are the same for all >>>>> `extern "c"` declarations with the same name, right?) can have different >>>>> qualified names and we won't know which one to choose. >>>>> >>>>> ``` >>>>> namespace a { >>>>> extern "C" int foo(); >>>>> } >>>>> namespace b { >>>>> extern "C" int foo(); // probably same USR, different qname. Also, >>>>> possibly different types. >>>>> } >>>>> ``` >>>>> >>>>> >>>>> Repository: >>>>> rL LLVM >>>>> >>>>> https://reviews.llvm.org/D42796 >>>>> >>>>> >>>>> >>>>> >>> >>> -- >>> Regards, >>> Ilya Biryukov >>> >> >> > > -- > Regards, > Ilya Biryukov >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits