[cfe-commits] r172290 - in /cfe/trunk: include/clang/AST/DeclBase.h include/clang/AST/ExternalASTSource.h include/clang/Basic/DiagnosticSemaKinds.td include/clang/Frontend/ASTUnit.h include/clang/Frontend/CompilerInstance.h include/clang/Lex/ModuleLoader.h include/clang/Sema/Lookup.h include/clang/Sema/Sema.h include/clang/Serialization/ASTReader.h lib/AST/DeclBase.cpp lib/Frontend/CompilerInstance.cpp lib/Sema/SemaDecl.cpp lib/Sema/SemaType.cpp lib/Serialization/ASTReader.cpp test/Modules/decldef.mm

NAKAMURA Takumi geek4civic at gmail.com
Fri Jan 11 18:08:40 PST 2013


Doug, didn't you update unittests?
http://bb.pgr.jp/builders/cmake-clang-x86_64-linux/builds/2487

(I could add no-op VoidModuleLoader::makeModuleVisible())

...Takumi

2013/1/12 Douglas Gregor <dgregor at apple.com>:
> Author: dgregor
> Date: Fri Jan 11 19:29:50 2013
> New Revision: 172290
>
> URL: http://llvm.org/viewvc/llvm-project?rev=172290&view=rev
> Log:
> Provide Decl::getOwningModule(), which determines the (sub)module in
> which a particular declaration resides. Use this information to
> customize the "definition of 'blah' must be imported from another
> module" diagnostic with the module the user actually has to
> import. Additionally, recover by importing that module, so we don't
> complain about other names in that module.
>
> Still TODO: coming up with decent Fix-Its for these cases, and expand
> this recovery approach for other name lookup failures.
>
>
> Modified:
>     cfe/trunk/include/clang/AST/DeclBase.h
>     cfe/trunk/include/clang/AST/ExternalASTSource.h
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Frontend/ASTUnit.h
>     cfe/trunk/include/clang/Frontend/CompilerInstance.h
>     cfe/trunk/include/clang/Lex/ModuleLoader.h
>     cfe/trunk/include/clang/Sema/Lookup.h
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/include/clang/Serialization/ASTReader.h
>     cfe/trunk/lib/AST/DeclBase.cpp
>     cfe/trunk/lib/Frontend/CompilerInstance.cpp
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/lib/Sema/SemaType.cpp
>     cfe/trunk/lib/Serialization/ASTReader.cpp
>     cfe/trunk/test/Modules/decldef.mm
>
> Modified: cfe/trunk/include/clang/AST/DeclBase.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclBase.h (original)
> +++ cfe/trunk/include/clang/AST/DeclBase.h Fri Jan 11 19:29:50 2013
> @@ -32,6 +32,7 @@
>  class EnumDecl;
>  class FunctionDecl;
>  class LinkageSpecDecl;
> +class Module;
>  class NamedDecl;
>  class NamespaceDecl;
>  class ObjCCategoryDecl;
> @@ -593,7 +594,18 @@
>
>      return 0;
>    }
> -
> +
> +private:
> +  Module *getOwningModuleSlow() const;
> +
> +public:
> +  Module *getOwningModule() const {
> +    if (!isFromASTFile())
> +      return 0;
> +
> +    return getOwningModuleSlow();
> +  }
> +
>    unsigned getIdentifierNamespace() const {
>      return IdentifierNamespace;
>    }
>
> Modified: cfe/trunk/include/clang/AST/ExternalASTSource.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExternalASTSource.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ExternalASTSource.h (original)
> +++ cfe/trunk/include/clang/AST/ExternalASTSource.h Fri Jan 11 19:29:50 2013
> @@ -25,6 +25,7 @@
>  class DeclarationName;
>  class ExternalSemaSource; // layering violation required for downcasting
>  class FieldDecl;
> +class Module;
>  class NamedDecl;
>  class RecordDecl;
>  class Selector;
> @@ -131,9 +132,12 @@
>    /// \brief Ensures that the table of all visible declarations inside this
>    /// context is up to date.
>    ///
> -  /// The default implementation of this functino is a no-op.
> +  /// The default implementation of this function is a no-op.
>    virtual void completeVisibleDeclsMap(const DeclContext *DC);
>
> +  /// \brief Retrieve the module that corresponds to the given module ID.
> +  virtual Module *getModule(unsigned ID) { return 0; }
> +
>    /// \brief Finds all declarations lexically contained within the given
>    /// DeclContext, after applying an optional filter predicate.
>    ///
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Jan 11 19:29:50 2013
> @@ -6082,7 +6082,7 @@
>    "local %select{struct|interface|union|class|enum}0 cannot be declared "
>    "__module_private__">;
>  def err_module_private_definition : Error<
> -  "definition of %0 must be imported before it is required">;
> +  "definition of %0 must be imported from module '%1' before it is required">;
>  }
>
>  let CategoryName = "Documentation Issue" in {
>
> Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original)
> +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Fri Jan 11 19:29:50 2013
> @@ -837,6 +837,10 @@
>      // ASTUnit doesn't know how to load modules (not that this matters).
>      return ModuleLoadResult();
>    }
> +
> +  virtual void makeModuleVisible(Module *Mod,
> +                                 Module::NameVisibilityKind Visibility) { }
> +
>  };
>
>  } // namespace clang
>
> Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInstance.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/CompilerInstance.h (original)
> +++ cfe/trunk/include/clang/Frontend/CompilerInstance.h Fri Jan 11 19:29:50 2013
> @@ -649,6 +649,10 @@
>                                        ModuleIdPath Path,
>                                        Module::NameVisibilityKind Visibility,
>                                        bool IsInclusionDirective);
> +
> +  virtual void makeModuleVisible(Module *Mod,
> +                                 Module::NameVisibilityKind Visibility);
> +
>  };
>
>  } // end namespace clang
>
> Modified: cfe/trunk/include/clang/Lex/ModuleLoader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleLoader.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/ModuleLoader.h (original)
> +++ cfe/trunk/include/clang/Lex/ModuleLoader.h Fri Jan 11 19:29:50 2013
> @@ -80,6 +80,10 @@
>                                        ModuleIdPath Path,
>                                        Module::NameVisibilityKind Visibility,
>                                        bool IsInclusionDirective) = 0;
> +
> +  /// \brief Make the given module visible.
> +  virtual void makeModuleVisible(Module *Mod,
> +                                 Module::NameVisibilityKind Visibility) = 0;
>  };
>
>  }
>
> Modified: cfe/trunk/include/clang/Sema/Lookup.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Lookup.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Lookup.h (original)
> +++ cfe/trunk/include/clang/Sema/Lookup.h Fri Jan 11 19:29:50 2013
> @@ -138,7 +138,8 @@
>        IDNS(0),
>        Redecl(Redecl != Sema::NotForRedeclaration),
>        HideTags(true),
> -      Diagnose(Redecl == Sema::NotForRedeclaration)
> +      Diagnose(Redecl == Sema::NotForRedeclaration),
> +      AllowHidden(Redecl == Sema::ForRedeclaration)
>    {
>      configure();
>    }
> @@ -158,7 +159,8 @@
>        IDNS(0),
>        Redecl(Redecl != Sema::NotForRedeclaration),
>        HideTags(true),
> -      Diagnose(Redecl == Sema::NotForRedeclaration)
> +      Diagnose(Redecl == Sema::NotForRedeclaration),
> +      AllowHidden(Redecl == Sema::ForRedeclaration)
>    {
>      configure();
>    }
> @@ -176,7 +178,8 @@
>        IDNS(Other.IDNS),
>        Redecl(Other.Redecl),
>        HideTags(Other.HideTags),
> -      Diagnose(false)
> +      Diagnose(false),
> +      AllowHidden(Other.AllowHidden)
>    {}
>
>    ~LookupResult() {
> @@ -214,10 +217,16 @@
>      return Redecl;
>    }
>
> +  /// \brief Specify whether hidden declarations are visible, e.g.,
> +  /// for recovery reasons.
> +  void setAllowHidden(bool AH) {
> +    AllowHidden = AH;
> +  }
> +
>    /// \brief Determine whether this lookup is permitted to see hidden
>    /// declarations, such as those in modules that have not yet been imported.
>    bool isHiddenDeclarationVisible() const {
> -    return Redecl || LookupKind == Sema::LookupTagName;
> +    return AllowHidden || LookupKind == Sema::LookupTagName;
>    }
>
>    /// Sets whether tag declarations should be hidden by non-tag
> @@ -483,6 +492,7 @@
>    /// \brief Change this lookup's redeclaration kind.
>    void setRedeclarationKind(Sema::RedeclarationKind RK) {
>      Redecl = RK;
> +    AllowHidden = (RK == Sema::ForRedeclaration);
>      configure();
>    }
>
> @@ -644,6 +654,9 @@
>    bool HideTags;
>
>    bool Diagnose;
> +
> +  /// \brief True if we should allow hidden declarations to be 'visible'.
> +  bool AllowHidden;
>  };
>
>    /// \brief Consumes visible declarations found when searching for
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jan 11 19:29:50 2013
> @@ -275,12 +275,6 @@
>    /// This is only necessary for issuing pretty diagnostics.
>    ExtVectorDeclsType ExtVectorDecls;
>
> -  /// \brief The set of types for which we have already complained about the
> -  /// definitions being hidden.
> -  ///
> -  /// This set is used to suppress redundant diagnostics.
> -  llvm::SmallPtrSet<NamedDecl *, 4> HiddenDefinitions;
> -
>    /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
>    OwningPtr<CXXFieldCollector> FieldCollector;
>
> @@ -1456,6 +1450,14 @@
>    DeclResult ActOnModuleImport(SourceLocation AtLoc, SourceLocation ImportLoc,
>                                 ModuleIdPath Path);
>
> +  /// \brief Create an implicit import of the given module at the given
> +  /// source location.
> +  ///
> +  /// This routine is typically used for error recovery, when the entity found
> +  /// by name lookup is actually hidden within a module that we know about but
> +  /// the user has forgotten to import.
> +  void createImplicitModuleImport(SourceLocation Loc, Module *Mod);
> +
>    /// \brief Retrieve a suitable printing policy.
>    PrintingPolicy getPrintingPolicy() const {
>      return getPrintingPolicy(Context, PP);
>
> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Fri Jan 11 19:29:50 2013
> @@ -1558,7 +1558,12 @@
>    /// \brief Retrieve the submodule that corresponds to a global submodule ID.
>    ///
>    Module *getSubmodule(serialization::SubmoduleID GlobalID);
> -
> +
> +  /// \brief Retrieve the module that corresponds to the given module ID.
> +  ///
> +  /// Note: overrides method in ExternalASTSource
> +  virtual Module *getModule(unsigned ID);
> +
>    /// \brief Retrieve a selector from the given module with its local ID
>    /// number.
>    Selector getLocalSelector(ModuleFile &M, unsigned LocalID);
>
> Modified: cfe/trunk/lib/AST/DeclBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
> +++ cfe/trunk/lib/AST/DeclBase.cpp Fri Jan 11 19:29:50 2013
> @@ -59,6 +59,11 @@
>    return Result;
>  }
>
> +Module *Decl::getOwningModuleSlow() const {
> +  assert(isFromASTFile() && "Not from AST file?");
> +  return getASTContext().getExternalSource()->getModule(getOwningModuleID());
> +}
> +
>  const char *Decl::getDeclKindName() const {
>    switch (DeclKind) {
>    default: llvm_unreachable("Declaration not in DeclNodes.inc!");
>
> Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Fri Jan 11 19:29:50 2013
> @@ -1201,3 +1201,9 @@
>    LastModuleImportResult = ModuleLoadResult(Module, false);
>    return LastModuleImportResult;
>  }
> +
> +void CompilerInstance::makeModuleVisible(Module *Mod,
> +                                         Module::NameVisibilityKind Visibility){
> +  ModuleManager->makeModuleVisible(Mod, Visibility);
> +}
> +
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Jan 11 19:29:50 2013
> @@ -11173,6 +11173,18 @@
>    return Import;
>  }
>
> +void Sema::createImplicitModuleImport(SourceLocation Loc, Module *Mod) {
> +  // Create the implicit import declaration.
> +  TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl();
> +  ImportDecl *ImportD = ImportDecl::CreateImplicit(getASTContext(), TU,
> +                                                   Loc, Mod, Loc);
> +  TU->addDecl(ImportD);
> +  Consumer.HandleImplicitImportDecl(ImportD);
> +
> +  // Make the module visible.
> +  PP.getModuleLoader().makeModuleVisible(Mod, Module::AllVisible);
> +}
> +
>  void Sema::ActOnPragmaRedefineExtname(IdentifierInfo* Name,
>                                        IdentifierInfo* AliasName,
>                                        SourceLocation PragmaLoc,
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jan 11 19:29:50 2013
> @@ -4392,9 +4392,14 @@
>        // repeating the diagnostic.
>        // FIXME: Add a Fix-It that imports the corresponding module or includes
>        // the header.
> -      if (isSFINAEContext() || HiddenDefinitions.insert(Def)) {
> -        Diag(Loc, diag::err_module_private_definition) << T;
> -        Diag(Def->getLocation(), diag::note_previous_definition);
> +      Module *Owner = Def->getOwningModule();
> +      Diag(Loc, diag::err_module_private_definition)
> +        << T << Owner->getFullModuleName();
> +      Diag(Def->getLocation(), diag::note_previous_definition);
> +
> +      if (!isSFINAEContext()) {
> +        // Recover by implicitly importing this module.
> +        createImplicitModuleImport(Loc, Owner);
>        }
>      }
>
>
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Jan 11 19:29:50 2013
> @@ -6200,7 +6200,11 @@
>
>    return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS];
>  }
> -
> +
> +Module *ASTReader::getModule(unsigned ID) {
> +  return getSubmodule(ID);
> +}
> +
>  Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
>    return DecodeSelector(getGlobalSelectorID(M, LocalID));
>  }
>
> Modified: cfe/trunk/test/Modules/decldef.mm
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/decldef.mm?rev=172290&r1=172289&r2=172290&view=diff
> ==============================================================================
> --- cfe/trunk/test/Modules/decldef.mm (original)
> +++ cfe/trunk/test/Modules/decldef.mm Fri Jan 11 19:29:50 2013
> @@ -2,13 +2,7 @@
>  // RUN: %clang_cc1 -fmodules -I %S/Inputs -fmodule-cache-path %t %s -verify
>
>
> -// in other file: expected-note{{previous definition is here}}
> -
> -
> -
> -
> -
> -// in other file: expected-note{{previous definition is here}}
> +// In other file: expected-note {{previous definition is here}}
>
>  @import decldef;
>  A *a1; // expected-error{{unknown type name 'A'}}
> @@ -19,10 +13,9 @@
>  B *b;
>
>  void testA(A *a) {
> -  a->ivar = 17; // expected-error{{definition of 'A' must be imported before it is required}}
> +  a->ivar = 17; // expected-error{{definition of 'A' must be imported from module 'decldef.Def' before it is required}}
>  }
>
>  void testB() {
> -  B b; // expected-error{{definition of 'B' must be imported before it is required}}
> -  B b2; // Note: the reundant error was silenced.
> +  B b; // Note: redundant error silenced
>  }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list