<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 21, 2017, at 4:56 PM, Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote">On 21 June 2017 at 16:55, Bruno Cardoso Lopes<span class="Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:bruno.cardoso@gmail.com" target="_blank" class="">bruno.cardoso@gmail.com</a>></span><span class="Apple-converted-space"> </span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><span class="">On Wed, Jun 21, 2017 at 4:44 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:<br class="">> On 21 June 2017 at 14:51, Bruno Cardoso Lopes <<a href="mailto:bruno.cardoso@gmail.com" class="">bruno.cardoso@gmail.com</a>><br class="">> wrote:<br class="">>><br class="">>> Hi Richard,<br class="">>><br class="">>> Somehow this commit caused some methods in ObjC to do not become<br class="">>> visible in an interface when compiling with modules on. I filed<br class="">>><span class="Apple-converted-space"> </span><a href="https://bugs.llvm.org/show_bug.cgi?id=33552" rel="noreferrer" target="_blank" class="">https://bugs.llvm.org/show_<wbr class="">bug.cgi?id=33552</a>, any idea what could have<br class="">>> gone wrong here? `hasVisibleDeclarationImpl` doesn't seem to have<br class="">>> changed the logic.<br class="">><br class="">><br class="">> DeclObjC.cpp is making some incorrect assumptions about what the isHidden()<br class="">> flag on Decls means. Looks like we're going to need to move all of the ObjC<br class="">> lookup machinery out of DeclObjC into Sema to allow it to perform correct<br class="">> visibility checks. (For what it's worth, this would already have been broken<br class="">> for Objective-C++ and local submodule visibility mode prior to this change,<br class="">> as those modes both have situations where the "Hidden" flag is not the<br class="">> complete story with regard to whether a declaration is visible in a<br class="">> particular lookup context.)<br class=""><br class=""></span>Oh, that's bad.<br class=""><br class="">Is there any workaround we can do on top of this change for now in<br class="">order to have the previous behavior for non-LSV and ObjC? This is<br class="">keeping Swift from building against upstream right now.</blockquote><div class=""><br class=""></div><div class="">Yes, I'm working on what should (hopefully) be a fairly quick short-term fix.</div></div></div></div></div></blockquote><div><br class=""></div><div>Thanks Richard!</div><div><br class=""></div><div>Do you have an eta on this?</div><div><br class=""></div><div>This is blocking swift from compiling against ToT LLVM. As you know these changes come in fast so the longer we wait, the more likely other breakage sneaks in. I imagine we are going to probably build against the newer llvm/clang in the next bit, so this is the worst time to have a long period of time of breakage.</div><div><br class=""></div><div>+CC Jordan Rose since I think he ran into this.</div><div><br class=""></div><div>Thanks in advance = ),</div><div>Michael</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""> </div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div class="HOEnZb"><div class="h5">>> Thanks,<br class="">>><br class="">>> On Wed, May 17, 2017 at 7:29 PM, Richard Smith via cfe-commits<br class="">>> <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class="">>> > Author: rsmith<br class="">>> > Date: Wed May 17 21:29:20 2017<br class="">>> > New Revision: 303322<br class="">>> ><br class="">>> > URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=303322&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project?rev=303322&view=rev</a><br class="">>> > Log:<br class="">>> > [modules] Switch from inferring owning modules based on source location<br class="">>> > to<br class="">>> > inferring based on the current module at the point of creation.<br class="">>> ><br class="">>> > This should result in no functional change except when building a<br class="">>> > preprocessed<br class="">>> > module (or more generally when using #pragma clang module begin/end to<br class="">>> > switch<br class="">>> > module in the middle of a file), in which case it allows us to correctly<br class="">>> > track<br class="">>> > the owning module for declarations. We can't map from FileID to module<br class="">>> > in the<br class="">>> > preprocessed module case, since all modules would have the same FileID.<br class="">>> ><br class="">>> > There are still a couple of remaining places that try to infer a module<br class="">>> > from a<br class="">>> > source location; I'll clean those up in follow-up changes.<br class="">>> ><br class="">>> > Modified:<br class="">>> >     cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h<br class="">>> >     cfe/trunk/include/clang/AST/<wbr class="">DeclBase.h<br class="">>> >     cfe/trunk/include/clang/Basic/<wbr class="">LangOptions.h<br class="">>> >     cfe/trunk/include/clang/Sema/<wbr class="">Sema.h<br class="">>> >     cfe/trunk/include/clang/<wbr class="">Serialization/ASTWriter.h<br class="">>> >     cfe/trunk/lib/CodeGen/<wbr class="">CGDebugInfo.cpp<br class="">>> >     cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp<br class="">>> >     cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp<br class="">>> >     cfe/trunk/lib/Sema/<wbr class="">SemaTemplate.cpp<br class="">>> >     cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp<br class="">>> >     cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp<br class="">>> >     cfe/trunk/test/Modules/<wbr class="">preprocess-module.cpp<br class="">>> >     cfe/trunk/test/SemaCXX/<wbr class="">modules-ts.cppm<br class="">>> ><br class="">>> > Modified: cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/AST/ASTContext.h?rev=<wbr class="">303322&r1=303321&r2=303322&<wbr class="">view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h (original)<br class="">>> > +++ cfe/trunk/include/clang/AST/<wbr class="">ASTContext.h Wed May 17 21:29:20 2017<br class="">>> > @@ -935,7 +935,7 @@ public:<br class="">>> ><br class="">>> >    /// \brief Get the additional modules in which the definition \p Def<br class="">>> > has<br class="">>> >    /// been merged.<br class="">>> > -  ArrayRef<Module*> getModulesWithMergedDefinition<wbr class="">(NamedDecl *Def) {<br class="">>> > +  ArrayRef<Module*> getModulesWithMergedDefinition<wbr class="">(const NamedDecl<br class="">>> > *Def) {<br class="">>> >      auto MergedIt = MergedDefModules.find(Def);<br class="">>> >      if (MergedIt == MergedDefModules.end())<br class="">>> >        return None;<br class="">>> ><br class="">>> > Modified: cfe/trunk/include/clang/AST/<wbr class="">DeclBase.h<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/AST/DeclBase.h?rev=<wbr class="">303322&r1=303321&r2=303322&<wbr class="">view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/include/clang/AST/<wbr class="">DeclBase.h (original)<br class="">>> > +++ cfe/trunk/include/clang/AST/<wbr class="">DeclBase.h Wed May 17 21:29:20 2017<br class="">>> > @@ -332,15 +332,15 @@ private:<br class="">>> >    bool AccessDeclContextSanity() const;<br class="">>> ><br class="">>> >  protected:<br class="">>> > -<br class="">>> >    Decl(Kind DK, DeclContext *DC, SourceLocation L)<br class="">>> > -    : NextInContextAndBits(), DeclCtx(DC),<br class="">>> > -      Loc(L), DeclKind(DK), InvalidDecl(0),<br class="">>> > -      HasAttrs(false), Implicit(false), Used(false), Referenced(false),<br class="">>> > -      Access(AS_none), FromASTFile(0), Hidden(DC &&<br class="">>> > cast<Decl>(DC)->Hidden),<br class="">>> > -      IdentifierNamespace(<wbr class="">getIdentifierNamespaceForKind(<wbr class="">DK)),<br class="">>> > -      CacheValidAndLinkage(0)<br class="">>> > -  {<br class="">>> > +      : NextInContextAndBits(), DeclCtx(DC), Loc(L), DeclKind(DK),<br class="">>> > +        InvalidDecl(0), HasAttrs(false), Implicit(false), Used(false),<br class="">>> > +        Referenced(false), Access(AS_none), FromASTFile(0),<br class="">>> > +        Hidden(DC && cast<Decl>(DC)->Hidden &&<br class="">>> > +               (!cast<Decl>(DC)-><wbr class="">isFromASTFile() ||<br class="">>> > +                hasLocalOwningModuleStorage())<wbr class="">),<br class="">>> > +        IdentifierNamespace(<wbr class="">getIdentifierNamespaceForKind(<wbr class="">DK)),<br class="">>> > +        CacheValidAndLinkage(0) {<br class="">>> >      if (StatisticsEnabled) add(DK);<br class="">>> >    }<br class="">>> ><br class="">>> > @@ -698,6 +698,9 @@ public:<br class="">>> >    Module *getLocalOwningModule() const {<br class="">>> >      if (isFromASTFile() || !Hidden)<br class="">>> >        return nullptr;<br class="">>> > +<br class="">>> > +    assert(<wbr class="">hasLocalOwningModuleStorage() &&<br class="">>> > +           "hidden local decl but no local module storage");<br class="">>> >      return reinterpret_cast<Module *const *>(this)[-1];<br class="">>> >    }<br class="">>> >    void setLocalOwningModule(Module *M) {<br class="">>> ><br class="">>> > Modified: cfe/trunk/include/clang/Basic/<wbr class="">LangOptions.h<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Basic/LangOptions.h?rev=<wbr class="">303322&r1=303321&r2=303322&<wbr class="">view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/include/clang/Basic/<wbr class="">LangOptions.h (original)<br class="">>> > +++ cfe/trunk/include/clang/Basic/<wbr class="">LangOptions.h Wed May 17 21:29:20 2017<br class="">>> > @@ -168,7 +168,7 @@ public:<br class="">>> ><br class="">>> >    /// Do we need to track the owning module for a local declaration?<br class="">>> >    bool trackLocalOwningModule() const {<br class="">>> > -    return ModulesLocalVisibility;<br class="">>> > +    return isCompilingModule() || ModulesLocalVisibility || ModulesTS;<br class="">>> >    }<br class="">>> ><br class="">>> >    bool isSignedOverflowDefined() const {<br class="">>> ><br class="">>> > Modified: cfe/trunk/include/clang/Sema/<wbr class="">Sema.h<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Sema/Sema.h?rev=303322&<wbr class="">r1=303321&r2=303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/include/clang/Sema/<wbr class="">Sema.h (original)<br class="">>> > +++ cfe/trunk/include/clang/Sema/<wbr class="">Sema.h Wed May 17 21:29:20 2017<br class="">>> > @@ -1507,6 +1507,12 @@ public:<br class="">>> >    hasVisibleDefaultArgument(<wbr class="">const NamedDecl *D,<br class="">>> >                              llvm::SmallVectorImpl<Module *> *Modules =<br class="">>> > nullptr);<br class="">>> ><br class="">>> > +  /// Determine if there is a visible declaration of \p D that is an<br class="">>> > explicit<br class="">>> > +  /// specialization declaration for a specialization of a template.<br class="">>> > (For a<br class="">>> > +  /// member specialization, use hasVisibleMemberSpecialization<wbr class="">.)<br class="">>> > +  bool hasVisibleExplicitSpecializati<wbr class="">on(<br class="">>> > +      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules =<br class="">>> > nullptr);<br class="">>> > +<br class="">>> >    /// Determine if there is a visible declaration of \p D that is a<br class="">>> > member<br class="">>> >    /// specialization declaration (as opposed to an instantiated<br class="">>> > declaration).<br class="">>> >    bool hasVisibleMemberSpecialization<wbr class="">(<br class="">>> > @@ -2360,7 +2366,7 @@ public:<br class="">>> >    void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool<br class="">>> > MergeTypeWithOld);<br class="">>> >    void MergeVarDeclExceptionSpecs(<wbr class="">VarDecl *New, VarDecl *Old);<br class="">>> >    bool checkVarDeclRedefinition(<wbr class="">VarDecl *OldDefn, VarDecl *NewDefn);<br class="">>> > -  void notePreviousDefinition(<wbr class="">SourceLocation Old, SourceLocation New);<br class="">>> > +  void notePreviousDefinition(const NamedDecl *Old, SourceLocation<br class="">>> > New);<br class="">>> >    bool MergeCXXFunctionDecl(<wbr class="">FunctionDecl *New, FunctionDecl *Old, Scope<br class="">>> > *S);<br class="">>> ><br class="">>> >    // AssignmentAction - This is used by all the assignment diagnostic<br class="">>> > functions<br class="">>> ><br class="">>> > Modified: cfe/trunk/include/clang/<wbr class="">Serialization/ASTWriter.h<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/Serialization/ASTWriter.<wbr class="">h?rev=303322&r1=303321&r2=<wbr class="">303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/include/clang/<wbr class="">Serialization/ASTWriter.h (original)<br class="">>> > +++ cfe/trunk/include/clang/<wbr class="">Serialization/ASTWriter.h Wed May 17<br class="">>> > 21:29:20 2017<br class="">>> > @@ -627,10 +627,6 @@ public:<br class="">>> >    /// \brief Add a version tuple to the given record<br class="">>> >    void AddVersionTuple(const VersionTuple &Version, RecordDataImpl<br class="">>> > &Record);<br class="">>> ><br class="">>> > -  /// \brief Infer the submodule ID that contains an entity at the<br class="">>> > given<br class="">>> > -  /// source location.<br class="">>> > -  serialization::SubmoduleID<br class="">>> > inferSubmoduleIDFromLocation(<wbr class="">SourceLocation Loc);<br class="">>> > -<br class="">>> >    /// \brief Retrieve or create a submodule ID for this module, or<br class="">>> > return 0 if<br class="">>> >    /// the submodule is neither local (a submodle of the<br class="">>> > currently-written module)<br class="">>> >    /// nor from an imported module.<br class="">>> ><br class="">>> > Modified: cfe/trunk/lib/CodeGen/<wbr class="">CGDebugInfo.cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CGDebugInfo.cpp?rev=303322&r1=<wbr class="">303321&r2=303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/lib/CodeGen/<wbr class="">CGDebugInfo.cpp (original)<br class="">>> > +++ cfe/trunk/lib/CodeGen/<wbr class="">CGDebugInfo.cpp Wed May 17 21:29:20 2017<br class="">>> > @@ -2613,7 +2613,7 @@ llvm::DIModule *CGDebugInfo::getParentMo<br class="">>> >      // best to make this behavior a command line or debugger tuning<br class="">>> >      // option.<br class="">>> >      FullSourceLoc Loc(D->getLocation(),<br class="">>> > CGM.getContext().<wbr class="">getSourceManager());<br class="">>> > -    if (Module *M = ClangModuleMap-><wbr class="">inferModuleFromLocation(Loc)) {<br class="">>> > +    if (Module *M = D->getOwningModule()) {<br class="">>> >        // This is a (sub-)module.<br class="">>> >        auto Info = ExternalASTSource::<wbr class="">ASTSourceDescriptor(*M);<br class="">>> >        return getOrCreateModuleRef(Info, /*SkeletonCU=*/false);<br class="">>> ><br class="">>> > Modified: cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/Sema/<wbr class="">SemaDecl.cpp?rev=303322&r1=<wbr class="">303321&r2=303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp (original)<br class="">>> > +++ cfe/trunk/lib/Sema/SemaDecl.<wbr class="">cpp Wed May 17 21:29:20 2017<br class="">>> > @@ -2021,7 +2021,7 @@ bool Sema::isIncompatibleTypedef(<wbr class="">TypeDec<br class="">>> >      Diag(New->getLocation(),<br class="">>> > diag::err_redefinition_<wbr class="">variably_modified_typedef)<br class="">>> >        << Kind << NewType;<br class="">>> >      if (Old->getLocation().isValid())<br class="">>> > -      notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +      notePreviousDefinition(Old, New->getLocation());<br class="">>> >      New->setInvalidDecl();<br class="">>> >      return true;<br class="">>> >    }<br class="">>> > @@ -2034,7 +2034,7 @@ bool Sema::isIncompatibleTypedef(<wbr class="">TypeDec<br class="">>> >      Diag(New->getLocation(), diag::err_redefinition_<wbr class="">different_typedef)<br class="">>> >        << Kind << NewType << OldType;<br class="">>> >      if (Old->getLocation().isValid())<br class="">>> > -      notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +      notePreviousDefinition(Old, New->getLocation());<br class="">>> >      New->setInvalidDecl();<br class="">>> >      return true;<br class="">>> >    }<br class="">>> > @@ -2101,7 +2101,7 @@ void Sema::MergeTypedefNameDecl(<wbr class="">Scope *S<br class="">>> ><br class="">>> >      NamedDecl *OldD = OldDecls.<wbr class="">getRepresentativeDecl();<br class="">>> >      if (OldD->getLocation().isValid()<wbr class="">)<br class="">>> > -      notePreviousDefinition(OldD-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +      notePreviousDefinition(OldD, New->getLocation());<br class="">>> ><br class="">>> >      return New->setInvalidDecl();<br class="">>> >    }<br class="">>> > @@ -2193,7 +2193,7 @@ void Sema::MergeTypedefNameDecl(<wbr class="">Scope *S<br class="">>> ><br class="">>> >      Diag(New->getLocation(), diag::err_redefinition)<br class="">>> >        << New->getDeclName();<br class="">>> > -    notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +    notePreviousDefinition(Old, New->getLocation());<br class="">>> >      return New->setInvalidDecl();<br class="">>> >    }<br class="">>> ><br class="">>> > @@ -2214,7 +2214,7 @@ void Sema::MergeTypedefNameDecl(<wbr class="">Scope *S<br class="">>> ><br class="">>> >    Diag(New->getLocation(), diag::ext_redefinition_of_<wbr class="">typedef)<br class="">>> >      << New->getDeclName();<br class="">>> > -  notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +  notePreviousDefinition(Old, New->getLocation());<br class="">>> >  }<br class="">>> ><br class="">>> >  /// DeclhasAttr - returns true if decl Declaration already has the<br class="">>> > target<br class="">>> > @@ -2448,7 +2448,7 @@ static bool mergeDeclAttribute(Sema &S,<br class="">>> >    return false;<br class="">>> >  }<br class="">>> ><br class="">>> > -static const Decl *getDefinition(const Decl *D) {<br class="">>> > +static const NamedDecl *getDefinition(const Decl *D) {<br class="">>> >    if (const TagDecl *TD = dyn_cast<TagDecl>(D))<br class="">>> >      return TD->getDefinition();<br class="">>> >    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {<br class="">>> > @@ -2475,7 +2475,7 @@ static void checkNewAttributesAfterDef(S<br class="">>> >    if (!New->hasAttrs())<br class="">>> >      return;<br class="">>> ><br class="">>> > -  const Decl *Def = getDefinition(Old);<br class="">>> > +  const NamedDecl *Def = getDefinition(Old);<br class="">>> >    if (!Def || Def == New)<br class="">>> >      return;<br class="">>> ><br class="">>> > @@ -2502,7 +2502,7 @@ static void checkNewAttributesAfterDef(S<br class="">>> >                              : diag::err_redefinition;<br class="">>> >          S.Diag(VD->getLocation(), Diag) << VD->getDeclName();<br class="">>> >          if (Diag == diag::err_redefinition)<br class="">>> > -          S.notePreviousDefinition(Def-><wbr class="">getLocation(),<br class="">>> > VD->getLocation());<br class="">>> > +          S.notePreviousDefinition(Def, VD->getLocation());<br class="">>> >          else<br class="">>> >            S.Diag(Def->getLocation(), diag::note_previous_<wbr class="">definition);<br class="">>> >          VD->setInvalidDecl();<br class="">>> > @@ -2891,7 +2891,7 @@ bool Sema::MergeFunctionDecl(<wbr class="">FunctionDec<br class="">>> >      } else {<br class="">>> >        Diag(New->getLocation(), diag::err_redefinition_<wbr class="">different_kind)<br class="">>> >          << New->getDeclName();<br class="">>> > -      notePreviousDefinition(OldD-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +      notePreviousDefinition(OldD, New->getLocation());<br class="">>> >        return true;<br class="">>> >      }<br class="">>> >    }<br class="">>> > @@ -2928,7 +2928,7 @@ bool Sema::MergeFunctionDecl(<wbr class="">FunctionDec<br class="">>> >        !Old->hasAttr<<wbr class="">InternalLinkageAttr>()) {<br class="">>> >      Diag(New->getLocation(), diag::err_internal_linkage_<wbr class="">redeclaration)<br class="">>> >          << New->getDeclName();<br class="">>> > -    notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +    notePreviousDefinition(Old, New->getLocation());<br class="">>> >      New->dropAttr<<wbr class="">InternalLinkageAttr>();<br class="">>> >    }<br class="">>> ><br class="">>> > @@ -3657,7 +3657,7 @@ void Sema::MergeVarDecl(VarDecl *New, Lo<br class="">>> >    if (!Old) {<br class="">>> >      Diag(New->getLocation(), diag::err_redefinition_<wbr class="">different_kind)<br class="">>> >          << New->getDeclName();<br class="">>> > -<br class="">>> > notePreviousDefinition(<wbr class="">Previous.<wbr class="">getRepresentativeDecl()-><wbr class="">getLocation(),<br class="">>> > +    notePreviousDefinition(<wbr class="">Previous.<wbr class="">getRepresentativeDecl(),<br class="">>> >                             New->getLocation());<br class="">>> >      return New->setInvalidDecl();<br class="">>> >    }<br class="">>> > @@ -3687,7 +3687,7 @@ void Sema::MergeVarDecl(VarDecl *New, Lo<br class="">>> >        Old->getStorageClass() == SC_None &&<br class="">>> >        !Old->hasAttr<WeakImportAttr>(<wbr class="">)) {<br class="">>> >      Diag(New->getLocation(), diag::warn_weak_import) <<<br class="">>> > New->getDeclName();<br class="">>> > -    notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +    notePreviousDefinition(Old, New->getLocation());<br class="">>> >      // Remove weak_import attribute on new declaration.<br class="">>> >      New->dropAttr<WeakImportAttr>(<wbr class="">);<br class="">>> >    }<br class="">>> > @@ -3696,7 +3696,7 @@ void Sema::MergeVarDecl(VarDecl *New, Lo<br class="">>> >        !Old->hasAttr<<wbr class="">InternalLinkageAttr>()) {<br class="">>> >      Diag(New->getLocation(), diag::err_internal_linkage_<wbr class="">redeclaration)<br class="">>> >          << New->getDeclName();<br class="">>> > -    notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +    notePreviousDefinition(Old, New->getLocation());<br class="">>> >      New->dropAttr<<wbr class="">InternalLinkageAttr>();<br class="">>> >    }<br class="">>> ><br class="">>> > @@ -3853,29 +3853,22 @@ void Sema::MergeVarDecl(VarDecl *New, Lo<br class="">>> >      New->setImplicitlyInline();<br class="">>> >  }<br class="">>> ><br class="">>> > -void Sema::notePreviousDefinition(<wbr class="">SourceLocation Old, SourceLocation<br class="">>> > New) {<br class="">>> > +void Sema::notePreviousDefinition(<wbr class="">const NamedDecl *Old, SourceLocation<br class="">>> > New) {<br class="">>> >    SourceManager &SrcMgr = getSourceManager();<br class="">>> >    auto FNewDecLoc = SrcMgr.getDecomposedLoc(New);<br class="">>> > -  auto FOldDecLoc = SrcMgr.getDecomposedLoc(Old);<br class="">>> > +  auto FOldDecLoc = SrcMgr.getDecomposedLoc(Old-><wbr class="">getLocation());<br class="">>> >    auto *FNew = SrcMgr.getFileEntryForID(<wbr class="">FNewDecLoc.first);<br class="">>> >    auto *FOld = SrcMgr.getFileEntryForID(<wbr class="">FOldDecLoc.first);<br class="">>> >    auto &HSI = PP.getHeaderSearchInfo();<br class="">>> > -  StringRef HdrFilename =<br class="">>> > SrcMgr.getFilename(SrcMgr.<wbr class="">getSpellingLoc(Old));<br class="">>> > +  StringRef HdrFilename =<br class="">>> > +      SrcMgr.getFilename(SrcMgr.<wbr class="">getSpellingLoc(Old-><wbr class="">getLocation()));<br class="">>> ><br class="">>> > -  auto noteFromModuleOrInclude = [&](SourceLocation &Loc,<br class="">>> > -                                     SourceLocation &IncLoc) -> bool {<br class="">>> > -    Module *Mod = nullptr;<br class="">>> > +  auto noteFromModuleOrInclude = [&](Module *Mod,<br class="">>> > +                                     SourceLocation IncLoc) -> bool {<br class="">>> >      // Redefinition errors with modules are common with non modular<br class="">>> > mapped<br class="">>> >      // headers, example: a non-modular header H in module A that also<br class="">>> > gets<br class="">>> >      // included directly in a TU. Pointing twice to the same<br class="">>> > header/definition<br class="">>> >      // is confusing, try to get better diagnostics when modules is on.<br class="">>> > -    if (getLangOpts().Modules) {<br class="">>> > -      auto ModLoc = SrcMgr.getModuleImportLoc(Old)<wbr class="">;<br class="">>> > -      if (!ModLoc.first.isInvalid())<br class="">>> > -        Mod = HSI.getModuleMap().<wbr class="">inferModuleFromLocation(<br class="">>> > -            FullSourceLoc(Loc, SrcMgr));<br class="">>> > -    }<br class="">>> > -<br class="">>> >      if (IncLoc.isValid()) {<br class="">>> >        if (Mod) {<br class="">>> >          Diag(IncLoc, diag::note_redefinition_<wbr class="">modules_same_file)<br class="">>> > @@ -3899,19 +3892,19 @@ void Sema::notePreviousDefinition(<wbr class="">Source<br class="">>> >    if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {<br class="">>> >      SourceLocation OldIncLoc = SrcMgr.getIncludeLoc(<wbr class="">FOldDecLoc.first);<br class="">>> >      SourceLocation NewIncLoc = SrcMgr.getIncludeLoc(<wbr class="">FNewDecLoc.first);<br class="">>> > -    EmittedDiag = noteFromModuleOrInclude(Old, OldIncLoc);<br class="">>> > -    EmittedDiag |= noteFromModuleOrInclude(New, NewIncLoc);<br class="">>> > +    EmittedDiag = noteFromModuleOrInclude(Old-><wbr class="">getOwningModule(),<br class="">>> > OldIncLoc);<br class="">>> > +    EmittedDiag |= noteFromModuleOrInclude(<wbr class="">getCurrentModule(),<br class="">>> > NewIncLoc);<br class="">>> ><br class="">>> >      // If the header has no guards, emit a note suggesting one.<br class="">>> >      if (FOld && !HSI.<wbr class="">isFileMultipleIncludeGuarded(<wbr class="">FOld))<br class="">>> > -      Diag(Old, diag::note_use_ifdef_guards);<br class="">>> > +      Diag(Old->getLocation(), diag::note_use_ifdef_guards);<br class="">>> ><br class="">>> >      if (EmittedDiag)<br class="">>> >        return;<br class="">>> >    }<br class="">>> ><br class="">>> >    // Redefinition coming from different files or couldn't do better<br class="">>> > above.<br class="">>> > -  Diag(Old, diag::note_previous_<wbr class="">definition);<br class="">>> > +  Diag(Old->getLocation(), diag::note_previous_<wbr class="">definition);<br class="">>> >  }<br class="">>> ><br class="">>> >  /// We've just determined that \p Old and \p New both appear to be<br class="">>> > definitions<br class="">>> > @@ -3934,7 +3927,7 @@ bool Sema::<wbr class="">checkVarDeclRedefinition(VarD<br class="">>> >      return false;<br class="">>> >    } else {<br class="">>> >      Diag(New->getLocation(), diag::err_redefinition) << New;<br class="">>> > -    notePreviousDefinition(Old-><wbr class="">getLocation(), New->getLocation());<br class="">>> > +    notePreviousDefinition(Old, New->getLocation());<br class="">>> >      New->setInvalidDecl();<br class="">>> >      return true;<br class="">>> >    }<br class="">>> > @@ -13503,9 +13496,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br class="">>> >              } else if (TUK == TUK_Reference &&<br class="">>> >                         (PrevTagDecl-><wbr class="">getFriendObjectKind() ==<br class="">>> >                              Decl::FOK_Undeclared ||<br class="">>> > -                        PP.<wbr class="">getModuleContainingLocation(<br class="">>> > -                            PrevDecl->getLocation()) !=<br class="">>> > -                            PP.<wbr class="">getModuleContainingLocation(<wbr class="">KWLoc)) &&<br class="">>> > +                        PrevDecl->getOwningModule() !=<br class="">>> > getCurrentModule()) &&<br class="">>> >                         SS.isEmpty()) {<br class="">>> >                // This declaration is a reference to an existing entity,<br class="">>> > but<br class="">>> >                // has different visibility from that entity: it either<br class="">>> > makes<br class="">>> > @@ -13561,7 +13552,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br class="">>> >                    Diag(NameLoc, diag::warn_redefinition_in_<wbr class="">param_list)<br class="">>> > << Name;<br class="">>> >                  else<br class="">>> >                    Diag(NameLoc, diag::err_redefinition) << Name;<br class="">>> > -                notePreviousDefinition(Def-><wbr class="">getLocation(),<br class="">>> > +                notePreviousDefinition(Def,<br class="">>> >                                         NameLoc.isValid() ? NameLoc :<br class="">>> > KWLoc);<br class="">>> >                  // If this is a redefinition, recover by making this<br class="">>> >                  // struct be anonymous, which will make any later<br class="">>> > @@ -13652,7 +13643,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br class="">>> >          // The tag name clashes with something else in the target<br class="">>> > scope,<br class="">>> >          // issue an error and recover by making this tag be anonymous.<br class="">>> >          Diag(NameLoc, diag::err_redefinition_<wbr class="">different_kind) << Name;<br class="">>> > -        notePreviousDefinition(<wbr class="">PrevDecl->getLocation(), NameLoc);<br class="">>> > +        notePreviousDefinition(<wbr class="">PrevDecl, NameLoc);<br class="">>> >          Name = nullptr;<br class="">>> >          Invalid = true;<br class="">>> >        }<br class="">>> > @@ -15356,7 +15347,7 @@ Decl *Sema::ActOnEnumConstant(Scope *S,<br class="">>> >          Diag(IdLoc, diag::err_redefinition_of_<wbr class="">enumerator) << Id;<br class="">>> >        else<br class="">>> >          Diag(IdLoc, diag::err_redefinition) << Id;<br class="">>> > -      notePreviousDefinition(<wbr class="">PrevDecl->getLocation(), IdLoc);<br class="">>> > +      notePreviousDefinition(<wbr class="">PrevDecl, IdLoc);<br class="">>> >        return nullptr;<br class="">>> >      }<br class="">>> >    }<br class="">>> ><br class="">>> > Modified: cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/Sema/<wbr class="">SemaLookup.cpp?rev=303322&r1=<wbr class="">303321&r2=303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp (original)<br class="">>> > +++ cfe/trunk/lib/Sema/SemaLookup.<wbr class="">cpp Wed May 17 21:29:20 2017<br class="">>> > @@ -1420,11 +1420,46 @@ bool Sema::<wbr class="">hasVisibleDefaultArgument(con<br class="">>> >                                       Modules);<br class="">>> >  }<br class="">>> ><br class="">>> > +template<typename Filter><br class="">>> > +static bool hasVisibleDeclarationImpl(Sema &S, const NamedDecl *D,<br class="">>> > +                                      llvm::SmallVectorImpl<Module *><br class="">>> > *Modules,<br class="">>> > +                                      Filter F) {<br class="">>> > +  for (auto *Redecl : D->redecls()) {<br class="">>> > +    auto *R = cast<NamedDecl>(Redecl);<br class="">>> > +    if (!F(R))<br class="">>> > +      continue;<br class="">>> > +<br class="">>> > +    if (S.isVisible(R))<br class="">>> > +      return true;<br class="">>> > +<br class="">>> > +    if (Modules) {<br class="">>> > +      Modules->push_back(R-><wbr class="">getOwningModule());<br class="">>> > +      const auto &Merged = S.Context.<wbr class="">getModulesWithMergedDefinition<wbr class="">(R);<br class="">>> > +      Modules->insert(Modules->end()<wbr class="">, Merged.begin(), Merged.end());<br class="">>> > +    }<br class="">>> > +  }<br class="">>> > +<br class="">>> > +  return false;<br class="">>> > +}<br class="">>> > +<br class="">>> > +bool Sema::<wbr class="">hasVisibleExplicitSpecializati<wbr class="">on(<br class="">>> > +    const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules) {<br class="">>> > +  return hasVisibleDeclarationImpl(*<wbr class="">this, D, Modules, [](const<br class="">>> > NamedDecl *D) {<br class="">>> > +    if (auto *RD = dyn_cast<CXXRecordDecl>(D))<br class="">>> > +      return RD-><wbr class="">getTemplateSpecializationKind(<wbr class="">) ==<br class="">>> > TSK_ExplicitSpecialization;<br class="">>> > +    if (auto *FD = dyn_cast<FunctionDecl>(D))<br class="">>> > +      return FD-><wbr class="">getTemplateSpecializationKind(<wbr class="">) ==<br class="">>> > TSK_ExplicitSpecialization;<br class="">>> > +    if (auto *VD = dyn_cast<VarDecl>(D))<br class="">>> > +      return VD-><wbr class="">getTemplateSpecializationKind(<wbr class="">) ==<br class="">>> > TSK_ExplicitSpecialization;<br class="">>> > +    llvm_unreachable("unknown explicit specialization kind");<br class="">>> > +  });<br class="">>> > +}<br class="">>> > +<br class="">>> >  bool Sema::<wbr class="">hasVisibleMemberSpecialization<wbr class="">(<br class="">>> >      const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules) {<br class="">>> >    assert(isa<CXXRecordDecl>(D-><wbr class="">getDeclContext()) &&<br class="">>> >           "not a member specialization");<br class="">>> > -  for (auto *Redecl : D->redecls()) {<br class="">>> > +  return hasVisibleDeclarationImpl(*<wbr class="">this, D, Modules, [](const<br class="">>> > NamedDecl *D) {<br class="">>> >      // If the specialization is declared at namespace scope, then it's<br class="">>> > a member<br class="">>> >      // specialization declaration. If it's lexically inside the class<br class="">>> >      // definition then it was instantiated.<br class="">>> > @@ -1432,19 +1467,8 @@ bool Sema::<wbr class="">hasVisibleMemberSpecializatio<br class="">>> >      // FIXME: This is a hack. There should be a better way to determine<br class="">>> > this.<br class="">>> >      // FIXME: What about MS-style explicit specializations declared<br class="">>> > within a<br class="">>> >      //        class definition?<br class="">>> > -    if (Redecl-><wbr class="">getLexicalDeclContext()-><wbr class="">isFileContext()) {<br class="">>> > -      auto *NonConstR =<br class="">>> > const_cast<NamedDecl*>(cast<<wbr class="">NamedDecl>(Redecl));<br class="">>> > -<br class="">>> > -      if (isVisible(NonConstR))<br class="">>> > -        return true;<br class="">>> > -<br class="">>> > -      if (Modules) {<br class="">>> > -        Modules->push_back(<wbr class="">getOwningModule(NonConstR));<br class="">>> > -        const auto &Merged =<br class="">>> > Context.<wbr class="">getModulesWithMergedDefinition<wbr class="">(NonConstR);<br class="">>> > -        Modules->insert(Modules->end()<wbr class="">, Merged.begin(), Merged.end());<br class="">>> > -      }<br class="">>> > -    }<br class="">>> > -  }<br class="">>> > +    return D->getLexicalDeclContext()-><wbr class="">isFileContext();<br class="">>> > +  });<br class="">>> ><br class="">>> >    return false;<br class="">>> >  }<br class="">>> > @@ -1459,23 +1483,19 @@ bool Sema::<wbr class="">hasVisibleMemberSpecializatio<br class="">>> >  /// your module can see, including those later on in your module).<br class="">>> >  bool LookupResult::isVisibleSlow(<wbr class="">Sema &SemaRef, NamedDecl *D) {<br class="">>> >    assert(D->isHidden() && "should not call this: not in slow case");<br class="">>> > -  Module *DeclModule = nullptr;<br class="">>> > -<br class="">>> > -  if (SemaRef.getLangOpts().<wbr class="">ModulesLocalVisibility) {<br class="">>> > -    DeclModule = SemaRef.getOwningModule(D);<br class="">>> > -    if (!DeclModule) {<br class="">>> > -      assert(!D->isHidden() && "hidden decl not from a module");<br class="">>> > -      return true;<br class="">>> > -    }<br class="">>> ><br class="">>> > -    // If the owning module is visible, and the decl is not module<br class="">>> > private,<br class="">>> > -    // then the decl is visible too. (Module private is ignored within<br class="">>> > the same<br class="">>> > -    // top-level module.)<br class="">>> > -    if ((!D->isFromASTFile() || !D->isModulePrivate()) &&<br class="">>> > -        (SemaRef.isModuleVisible(<wbr class="">DeclModule) ||<br class="">>> > -         SemaRef.<wbr class="">hasVisibleMergedDefinition(D))<wbr class="">)<br class="">>> > -      return true;<br class="">>> > -  }<br class="">>> > +  Module *DeclModule = SemaRef.getOwningModule(D);<br class="">>> > +  assert(DeclModule && "hidden decl not from a module");<br class="">>> > +<br class="">>> > +  // If the owning module is visible, and the decl is not module<br class="">>> > private,<br class="">>> > +  // then the decl is visible too. (Module private is ignored within<br class="">>> > the same<br class="">>> > +  // top-level module.)<br class="">>> > +  // FIXME: Check the owning module for module-private declarations<br class="">>> > rather than<br class="">>> > +  // assuming "same AST file" is the same thing as "same module".<br class="">>> > +  if ((!D->isFromASTFile() || !D->isModulePrivate()) &&<br class="">>> > +      (SemaRef.isModuleVisible(<wbr class="">DeclModule) ||<br class="">>> > +       SemaRef.<wbr class="">hasVisibleMergedDefinition(D))<wbr class="">)<br class="">>> > +    return true;<br class="">>> ><br class="">>> >    // If this declaration is not at namespace scope nor module-private,<br class="">>> >    // then it is visible if its lexical parent has a visible definition.<br class="">>> > @@ -1571,20 +1591,8 @@ static NamedDecl *findAcceptableDecl(Sem<br class="">>> >  bool Sema::<wbr class="">hasVisibleDeclarationSlow(<wbr class="">const NamedDecl *D,<br class="">>> >                                       llvm::SmallVectorImpl<Module *><br class="">>> > *Modules) {<br class="">>> >    assert(!isVisible(D) && "not in slow case");<br class="">>> > -<br class="">>> > -  for (auto *Redecl : D->redecls()) {<br class="">>> > -    auto *NonConstR = const_cast<NamedDecl*>(cast<<wbr class="">NamedDecl>(Redecl));<br class="">>> > -    if (isVisible(NonConstR))<br class="">>> > -      return true;<br class="">>> > -<br class="">>> > -    if (Modules) {<br class="">>> > -      Modules->push_back(<wbr class="">getOwningModule(NonConstR));<br class="">>> > -      const auto &Merged =<br class="">>> > Context.<wbr class="">getModulesWithMergedDefinition<wbr class="">(NonConstR);<br class="">>> > -      Modules->insert(Modules->end()<wbr class="">, Merged.begin(), Merged.end());<br class="">>> > -    }<br class="">>> > -  }<br class="">>> > -<br class="">>> > -  return false;<br class="">>> > +  return hasVisibleDeclarationImpl(*<wbr class="">this, D, Modules,<br class="">>> > +                                   [](const NamedDecl *) { return true;<br class="">>> > });<br class="">>> >  }<br class="">>> ><br class="">>> >  NamedDecl *LookupResult::<wbr class="">getAcceptableDeclSlow(<wbr class="">NamedDecl *D) const {<br class="">>> > @@ -4957,6 +4965,14 @@ void Sema::diagnoseMissingImport(<wbr class="">SourceL<br class="">>> >                                   MissingImportKind MIK, bool Recover) {<br class="">>> >    assert(!Modules.empty());<br class="">>> ><br class="">>> > +  // Weed out duplicates from module list.<br class="">>> > +  llvm::SmallVector<Module*, 8> UniqueModules;<br class="">>> > +  llvm::SmallDenseSet<Module*, 8> UniqueModuleSet;<br class="">>> > +  for (auto *M : Modules)<br class="">>> > +    if (UniqueModuleSet.insert(M).<wbr class="">second)<br class="">>> > +      UniqueModules.push_back(M);<br class="">>> > +  Modules = UniqueModules;<br class="">>> > +<br class="">>> >    if (Modules.size() > 1) {<br class="">>> >      std::string ModuleList;<br class="">>> >      unsigned N = 0;<br class="">>> ><br class="">>> > Modified: cfe/trunk/lib/Sema/<wbr class="">SemaTemplate.cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/Sema/<wbr class="">SemaTemplate.cpp?rev=303322&<wbr class="">r1=303321&r2=303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/lib/Sema/<wbr class="">SemaTemplate.cpp (original)<br class="">>> > +++ cfe/trunk/lib/Sema/<wbr class="">SemaTemplate.cpp Wed May 17 21:29:20 2017<br class="">>> > @@ -7901,6 +7901,7 @@ bool Sema::<wbr class="">CheckFunctionTemplateSpeciali<br class="">>> >    TemplateSpecializationKind TSK =<br class="">>> > SpecInfo-><wbr class="">getTemplateSpecializationKind(<wbr class="">);<br class="">>> >    if (TSK == TSK_Undeclared || TSK == TSK_ImplicitInstantiation) {<br class="">>> >      Specialization->setLocation(<wbr class="">FD->getLocation());<br class="">>> > +    Specialization-><wbr class="">setLexicalDeclContext(FD-><wbr class="">getLexicalDeclContext());<br class="">>> >      // C++11 [dcl.constexpr]p1: An explicit specialization of a<br class="">>> > constexpr<br class="">>> >      // function can differ from the template declaration with respect<br class="">>> > to<br class="">>> >      // the constexpr specifier.<br class="">>> > @@ -7961,6 +7962,7 @@ bool Sema::<wbr class="">CheckFunctionTemplateSpeciali<br class="">>> >        // FIXME: We need an update record for this AST mutation.<br class="">>> >        Specialization-><wbr class="">setDeletedAsWritten(false);<br class="">>> >      }<br class="">>> > +    // FIXME: We need an update record for this AST mutation.<br class="">>> ><br class="">>> > SpecInfo-><wbr class="">setTemplateSpecializationKind(<wbr class="">TSK_ExplicitSpecialization);<br class="">>> >      MarkUnusedFileScopedDecl(<wbr class="">Specialization);<br class="">>> >    }<br class="">>> > @@ -9745,7 +9747,7 @@ private:<br class="">>> >        IsHiddenExplicitSpecialization =<br class="">>> >            Spec-><wbr class="">getMemberSpecializationInfo()<br class="">>> >                ? !S.<wbr class="">hasVisibleMemberSpecialization<wbr class="">(Spec, &Modules)<br class="">>> > -              : !S.hasVisibleDeclaration(Spec)<wbr class="">;<br class="">>> > +              : !S.<wbr class="">hasVisibleExplicitSpecializati<wbr class="">on(Spec, &Modules);<br class="">>> >      } else {<br class="">>> >        checkInstantiated(Spec);<br class="">>> >      }<br class="">>> ><br class="">>> > Modified: cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTWriter.cpp?<wbr class="">rev=303322&r1=303321&r2=<wbr class="">303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp (original)<br class="">>> > +++ cfe/trunk/lib/Serialization/<wbr class="">ASTWriter.cpp Wed May 17 21:29:20 2017<br class="">>> > @@ -2841,25 +2841,6 @@ void ASTWriter::WriteSubmodules(<wbr class="">Module *<br class="">>> >           "non-imported submodule?");<br class="">>> >  }<br class="">>> ><br class="">>> > -serialization::SubmoduleID<br class="">>> > -ASTWriter::<wbr class="">inferSubmoduleIDFromLocation(<wbr class="">SourceLocation Loc) {<br class="">>> > -  if (Loc.isInvalid() || !WritingModule)<br class="">>> > -    return 0; // No submodule<br class="">>> > -<br class="">>> > -  // Find the module that owns this location.<br class="">>> > -  ModuleMap &ModMap = PP->getHeaderSearchInfo().<wbr class="">getModuleMap();<br class="">>> > -  Module *OwningMod<br class="">>> > -    =<br class="">>> > ModMap.<wbr class="">inferModuleFromLocation(<wbr class="">FullSourceLoc(Loc,PP-><wbr class="">getSourceManager()));<br class="">>> > -  if (!OwningMod)<br class="">>> > -    return 0;<br class="">>> > -<br class="">>> > -  // Check whether this submodule is part of our own module.<br class="">>> > -  if (WritingModule != OwningMod &&<br class="">>> > !OwningMod->isSubModuleOf(<wbr class="">WritingModule))<br class="">>> > -    return 0;<br class="">>> > -<br class="">>> > -  return getSubmoduleID(OwningMod);<br class="">>> > -}<br class="">>> > -<br class="">>> >  void ASTWriter::<wbr class="">WritePragmaDiagnosticMappings(<wbr class="">const DiagnosticsEngine<br class="">>> > &Diag,<br class="">>> >                                                bool isModule) {<br class="">>> >    llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned,<br class="">>> > 64><br class="">>> ><br class="">>> > Modified: cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/<wbr class="">Serialization/ASTWriterDecl.<wbr class="">cpp?rev=303322&r1=303321&r2=<wbr class="">303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp (original)<br class="">>> > +++ cfe/trunk/lib/Serialization/<wbr class="">ASTWriterDecl.cpp Wed May 17 21:29:20<br class="">>> > 2017<br class="">>> > @@ -299,7 +299,7 @@ void ASTDeclWriter::VisitDecl(Decl *D) {<br class="">>> >    Record.push_back(D-><wbr class="">isTopLevelDeclInObjCContainer(<wbr class="">));<br class="">>> >    Record.push_back(D->getAccess(<wbr class="">));<br class="">>> >    Record.push_back(D-><wbr class="">isModulePrivate());<br class="">>> > -<br class="">>> > Record.push_back(Writer.<wbr class="">inferSubmoduleIDFromLocation(<wbr class="">D->getLocation()));<br class="">>> > +  Record.push_back(Writer.<wbr class="">getSubmoduleID(D-><wbr class="">getOwningModule()));<br class="">>> ><br class="">>> >    // If this declaration injected a name into a context different from<br class="">>> > its<br class="">>> >    // lexical context, and that context is an imported namespace, we<br class="">>> > need to<br class="">>> ><br class="">>> > Modified: cfe/trunk/test/Modules/<wbr class="">preprocess-module.cpp<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/preprocess-module.cpp?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/test/<wbr class="">Modules/preprocess-module.cpp?<wbr class="">rev=303322&r1=303321&r2=<wbr class="">303322&view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/test/Modules/<wbr class="">preprocess-module.cpp (original)<br class="">>> > +++ cfe/trunk/test/Modules/<wbr class="">preprocess-module.cpp Wed May 17 21:29:20<br class="">>> > 2017<br class="">>> > @@ -25,8 +25,8 @@<br class="">>> >  // RUN: %clang_cc1 -fmodules -fmodule-name=file<br class="">>> > -fmodule-file=%t/fwd.pcm<br class="">>> > -fmodule-map-file=%S/Inputs/<wbr class="">preprocess/module.modulemap -x<br class="">>> > c++-module-map-cpp-output %t/rewrite.ii -emit-module -o /dev/null<br class="">>> ><br class="">>> >  // Check the module we built works.<br class="">>> > -// RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.<wbr class="">pcm %s -verify<br class="">>> > -// RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -verify<br class="">>> > +// RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.<wbr class="">pcm %s -I%t<br class="">>> > -verify -fno-modules-error-recovery<br class="">>> > +// RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -I%t<br class="">>> > -verify -fno-modules-error-recovery -DREWRITE<br class="">>> ><br class="">>> ><br class="">>> >  // == module map<br class="">>> > @@ -95,10 +95,12 @@<br class="">>> >  // NO-REWRITE: #pragma clang module end<br class="">>> ><br class="">>> ><br class="">>> > -// expected-no-diagnostics<br class="">>> > -<br class="">>> > -// FIXME: This should be rejected: we have not imported the submodule<br class="">>> > defining it yet.<br class="">>> > -__FILE *a;<br class="">>> > +__FILE *a; // expected-error {{declaration of '__FILE' must be<br class="">>> > imported}}<br class="">>> > +#ifdef REWRITE<br class="">>> > +// <a href="mailto:expected-note@rewrite.ii" class="">expected-note@rewrite.ii</a>:1 {{here}}<br class="">>> > +#else<br class="">>> > +// <a href="mailto:expected-note@no-rewrite.ii" class="">expected-note@no-rewrite.ii</a>:1 {{here}}<br class="">>> > +#endif<br class="">>> ><br class="">>> >  #pragma clang module import file<br class="">>> ><br class="">>> ><br class="">>> > Modified: cfe/trunk/test/SemaCXX/<wbr class="">modules-ts.cppm<br class="">>> > URL:<br class="">>> ><span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/modules-ts.cppm?rev=303322&r1=303321&r2=303322&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/test/<wbr class="">SemaCXX/modules-ts.cppm?rev=<wbr class="">303322&r1=303321&r2=303322&<wbr class="">view=diff</a><br class="">>> ><br class="">>> > ==============================<wbr class="">==============================<wbr class="">==================<br class="">>> > --- cfe/trunk/test/SemaCXX/<wbr class="">modules-ts.cppm (original)<br class="">>> > +++ cfe/trunk/test/SemaCXX/<wbr class="">modules-ts.cppm Wed May 17 21:29:20 2017<br class="">>> > @@ -18,7 +18,8 @@ int n;<br class="">>> >  #if TEST >= 2<br class="">>> >  // expected-error@-2 {{redefinition of '}}<br class="">>> >  // expected-note@-3 {{unguarded header; consider using #ifdef guards or<br class="">>> > #pragma once}}<br class="">>> > -// expected-note-re@modules-ts.<wbr class="">cppm:1 {{'{{.*}}modules-ts.cppm'<br class="">>> > included multiple times, additional include site here}}<br class="">>> > +// FIXME: We should drop the "header from" in this diagnostic.<br class="">>> > +// expected-note-re@modules-ts.<wbr class="">cppm:1 {{'{{.*}}modules-ts.cppm'<br class="">>> > included multiple times, additional include site in header from module<br class="">>> > 'foo'}}<br class="">>> >  #endif<br class="">>> ><br class="">>> >  #if TEST == 0<br class="">>> ><br class="">>> ><br class="">>> > ______________________________<wbr class="">_________________<br class="">>> > cfe-commits mailing list<br class="">>> ><span class="Apple-converted-space"> </span><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">>> ><span class="Apple-converted-space"> </span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/cfe-commits</a><br class="">>><br class="">>><br class="">>><br class="">>> --<br class="">>> Bruno Cardoso Lopes<br class="">>><span class="Apple-converted-space"> </span><a href="http://www.brunocardoso.cc/" rel="noreferrer" target="_blank" class="">http://www.brunocardoso.cc</a><br class="">><br class="">><br class=""><br class=""><br class=""><br class="">--<br class="">Bruno Cardoso Lopes<br class=""><a href="http://www.brunocardoso.cc/" rel="noreferrer" target="_blank" class="">http://www.brunocardoso.cc</a><br class=""></div></div></blockquote></div><br class=""></div></div><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">cfe-commits mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a></span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a></span></div></blockquote></div><br class=""></body></html>