Author: rsmith Date: Mon Nov 16 21:02:41 2015 New Revision: 253283 URL: http://llvm.org/viewvc/llvm-project?rev=253283&view=rev Log: [modules] Fix some more cases where we used to reject a conflict between two declarations that are not simultaneously visible, and where at least one of them has internal/no linkage.
Modified: cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/lib/Sema/SemaLookup.cpp cfe/trunk/test/Modules/Inputs/no-linkage/decls.h cfe/trunk/test/Modules/no-linkage.cpp Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=253283&r1=253282&r2=253283&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Mon Nov 16 21:02:41 2015 @@ -279,6 +279,7 @@ class Sema { // with internal linkage. return isVisible(Old) || New->isExternallyVisible(); } + bool shouldLinkPossiblyHiddenDecl(LookupResult &Old, const NamedDecl *New); public: typedef OpaquePtr<DeclGroupRef> DeclGroupPtrTy; Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=253283&r1=253282&r2=253283&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Nov 16 21:02:41 2015 @@ -1834,8 +1834,7 @@ static void filterNonConflictingPrevious continue; } - if (!Old->isExternallyVisible()) - Filter.erase(); + Filter.erase(); } Filter.done(); @@ -3344,6 +3343,9 @@ void Sema::MergeVarDecl(VarDecl *New, Lo if (New->isInvalidDecl()) return; + if (!shouldLinkPossiblyHiddenDecl(Previous, New)) + return; + VarTemplateDecl *NewTemplate = New->getDescribedVarTemplate(); // Verify the old decl was also a variable or variable template. @@ -3375,9 +3377,6 @@ void Sema::MergeVarDecl(VarDecl *New, Lo return New->setInvalidDecl(); } - if (!shouldLinkPossiblyHiddenDecl(Old, New)) - return; - // Ensure the template parameters are compatible. if (NewTemplate && !TemplateParameterListsAreEqual(NewTemplate->getTemplateParameters(), Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=253283&r1=253282&r2=253283&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Nov 16 21:02:41 2015 @@ -8684,9 +8684,11 @@ Decl *Sema::ActOnNamespaceAliasDef(Scope assert(!R.isAmbiguous() && !R.empty()); // Check if we have a previous declaration with the same name. - NamedDecl *PrevDecl = LookupSingleName(S, Alias, AliasLoc, LookupOrdinaryName, - ForRedeclaration); - if (PrevDecl && !isDeclInScope(PrevDecl, CurContext, S)) + LookupResult PrevR(*this, Alias, AliasLoc, LookupOrdinaryName, + ForRedeclaration); + LookupQualifiedName(PrevR, CurContext->getRedeclContext()); + NamedDecl *PrevDecl = PrevR.getAsSingle<NamedDecl>(); + if (PrevDecl && !isVisible(PrevDecl)) PrevDecl = nullptr; NamedDecl *ND = R.getFoundDecl(); Modified: cfe/trunk/lib/Sema/SemaLookup.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=253283&r1=253282&r2=253283&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaLookup.cpp (original) +++ cfe/trunk/lib/Sema/SemaLookup.cpp Mon Nov 16 21:02:41 2015 @@ -1547,6 +1547,14 @@ bool Sema::isVisibleSlow(const NamedDecl return LookupResult::isVisible(*this, const_cast<NamedDecl*>(D)); } +bool Sema::shouldLinkPossiblyHiddenDecl(LookupResult &R, const NamedDecl *New) { + for (auto *D : R) { + if (isVisible(D)) + return true; + } + return New->isExternallyVisible(); +} + /// \brief Retrieve the visible declaration corresponding to D, if any. /// /// This routine determines whether the declaration D is visible in the current Modified: cfe/trunk/test/Modules/Inputs/no-linkage/decls.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/no-linkage/decls.h?rev=253283&r1=253282&r2=253283&view=diff ============================================================================== --- cfe/trunk/test/Modules/Inputs/no-linkage/decls.h (original) +++ cfe/trunk/test/Modules/Inputs/no-linkage/decls.h Mon Nov 16 21:02:41 2015 @@ -3,3 +3,9 @@ namespace NS = RealNS; typedef int Typedef; using AliasDecl = int; using RealNS::UsingDecl; +struct Struct {}; +extern int Variable; +namespace AnotherNS {} +enum X { Enumerator }; +void Overloads(); +void Overloads(int); Modified: cfe/trunk/test/Modules/no-linkage.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/no-linkage.cpp?rev=253283&r1=253282&r2=253283&view=diff ============================================================================== --- cfe/trunk/test/Modules/no-linkage.cpp (original) +++ cfe/trunk/test/Modules/no-linkage.cpp Mon Nov 16 21:02:41 2015 @@ -7,11 +7,24 @@ namespace NS { int n; } // expected-note struct Typedef { int n; }; // expected-note {{candidate}} int AliasDecl; // expected-note {{candidate}} int UsingDecl; // expected-note {{candidate}} +namespace RealNS = NS; // expected-note {{candidate}} +typedef int Struct; // expected-note {{candidate}} +enum { Variable }; // expected-note {{candidate}} +const int AnotherNS = 0; // expected-note {{candidate}} +const int Enumerator = 0; // expected-note {{candidate}} +static int Overloads; // expected-note {{candidate}} +// expected-note@decls.h:1 {{candidate}} // expected-note@decls.h:2 {{candidate}} // expected-note@decls.h:3 {{candidate}} // expected-note@decls.h:4 {{candidate}} // expected-note@decls.h:5 {{candidate}} +// expected-note@decls.h:6 {{candidate}} +// expected-note@decls.h:7 {{candidate}} +// expected-note@decls.h:8 {{candidate}} +// expected-note@decls.h:9 {{candidate}} +// expected-note@decls.h:10 {{candidate}} +// expected-note@decls.h:11 {{candidate}} void use(int); void use_things() { @@ -19,6 +32,12 @@ void use_things() { use(NS::n); use(AliasDecl); use(UsingDecl); + use(RealNS::n); + use(Struct(0)); + use(Variable); + use(AnotherNS); + use(Enumerator); + use(Overloads); } #include "decls.h" @@ -28,4 +47,10 @@ void use_things_again() { use(NS::n); // expected-error {{ambiguous}} use(AliasDecl); // expected-error {{ambiguous}} use(UsingDecl); // expected-error {{ambiguous}} + use(RealNS::n); // expected-error {{ambiguous}} + use(Struct(0)); // expected-error {{ambiguous}} + use(Variable); // expected-error {{ambiguous}} + use(AnotherNS); // expected-error {{ambiguous}} + use(Enumerator); // expected-error {{ambiguous}} + use(Overloads); // expected-error {{ambiguous}} } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits