[Modules] Fix overly conservative assertion for import diagnostic

We currenltly assert when want to diagnose a missing import and the decl
in question is already visible. It turns out that the decl in question
might be visible because another decl from the same module actually made
the module visible in a previous error diagnostic.

Remove the assertion and avoid re-exporting the module if it's already
visible.

rdar://problem/27975402

Differential Revision: https://reviews.llvm.org/D32828

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@303705 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bruno Cardoso Lopes 2017-05-23 23:53:17 +00:00
parent 9b792b1316
commit ed367df541
5 changed files with 27 additions and 3 deletions

View File

@ -16097,7 +16097,8 @@ void Sema::ActOnModuleEnd(SourceLocation EomLoc, Module *Mod) {
void Sema::createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
Module *Mod) {
// Bail if we're not allowed to implicitly import a module here.
if (isSFINAEContext() || !getLangOpts().ModulesErrorRecovery)
if (isSFINAEContext() || !getLangOpts().ModulesErrorRecovery ||
VisibleModules.isVisible(Mod))
return;
// Create the implicit import declaration.

View File

@ -4933,8 +4933,6 @@ static NamedDecl *getDefinitionToImport(NamedDecl *D) {
void Sema::diagnoseMissingImport(SourceLocation Loc, NamedDecl *Decl,
MissingImportKind MIK, bool Recover) {
assert(!isVisible(Decl) && "missing import for non-hidden decl?");
// Suggest importing a module providing the definition of this entity, if
// possible.
NamedDecl *Def = getDefinitionToImport(Decl);

View File

@ -0,0 +1,8 @@
#ifndef A_h
#define A_h
@class NSString;
static NSString * const xyzRiskyCloseOpenParam = @"riskyCloseParam";
static inline void XYZLogEvent(NSString* eventName, NSString* params);
#endif

View File

@ -0,0 +1,3 @@
module NCI {
explicit module A { header "a.h" }
}

View File

@ -0,0 +1,14 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/diagnose-missing-import \
// RUN: -Werror=implicit-function-declaration -fsyntax-only \
// RUN: -fimplicit-module-maps -verify %s
@import NCI;
void foo() {
XYZLogEvent(xyzRiskyCloseOpenParam, xyzRiskyCloseOpenParam); // expected-error {{implicit declaration of function 'XYZLogEvent'}} expected-error {{declaration of 'XYZLogEvent' must be imported}} expected-error {{declaration of 'xyzRiskyCloseOpenParam' must be imported from module 'NCI.A'}} expected-error {{declaration of 'xyzRiskyCloseOpenParam' must be imported from module 'NCI.A'}}
}
// expected-note@Inputs/diagnose-missing-import/a.h:5 {{previous declaration is here}}
// expected-note@Inputs/diagnose-missing-import/a.h:5 {{previous declaration is here}}
// expected-note@Inputs/diagnose-missing-import/a.h:6 {{previous declaration is here}}