[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:18:32 PST 2013
Applied in r172295. Please confirm.
...Takumi
2013/1/12 NAKAMURA Takumi <geek4civic at gmail.com>:
> 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