forked from OSchip/llvm-project
[modules] Even if we already have a definition of a class, loading in another
one can give us more lookup results (due to implicit special members). Be sure to complete the redecl chain for every kind of DeclContext before performing a lookup into it, rather than only doing so for NamespaceDecls. llvm-svn: 230558
This commit is contained in:
parent
e9401f61c2
commit
8cebe37fe9
|
@ -1308,12 +1308,16 @@ DeclContext::lookup(DeclarationName Name) const {
|
|||
if (PrimaryContext != this)
|
||||
return PrimaryContext->lookup(Name);
|
||||
|
||||
// If this is a namespace, ensure that any later redeclarations of it have
|
||||
// been loaded, since they may add names to the result of this lookup.
|
||||
if (auto *ND = dyn_cast<NamespaceDecl>(this))
|
||||
(void)ND->getMostRecentDecl();
|
||||
// If we have an external source, ensure that any later redeclarations of this
|
||||
// context have been loaded, since they may add names to the result of this
|
||||
// lookup (or add external visible storage).
|
||||
ExternalASTSource *Source = getParentASTContext().getExternalSource();
|
||||
if (Source)
|
||||
(void)cast<Decl>(this)->getMostRecentDecl();
|
||||
|
||||
if (hasExternalVisibleStorage()) {
|
||||
assert(Source && "external visible storage but no external source?");
|
||||
|
||||
if (NeedToReconcileExternalVisibleStorage)
|
||||
reconcileExternalVisibleStorage();
|
||||
|
||||
|
@ -1332,7 +1336,6 @@ DeclContext::lookup(DeclarationName Name) const {
|
|||
if (!R.second && !R.first->second.hasExternalDecls())
|
||||
return R.first->second.getLookupResult();
|
||||
|
||||
ExternalASTSource *Source = getParentASTContext().getExternalSource();
|
||||
if (Source->FindExternalVisibleDeclsByName(this, Name) || !R.second) {
|
||||
if (StoredDeclsMap *Map = LookupPtr.getPointer()) {
|
||||
StoredDeclsMap::iterator I = Map->find(Name);
|
||||
|
|
|
@ -1288,8 +1288,11 @@ bool CompilerInstance::loadModuleFile(StringRef FileName) {
|
|||
bool needsImportVisitation() const override { return true; }
|
||||
|
||||
void visitImport(StringRef FileName) override {
|
||||
if (!CI.ExplicitlyLoadedModuleFiles.insert(FileName).second)
|
||||
if (!CI.ExplicitlyLoadedModuleFiles.insert(FileName).second) {
|
||||
if (ModuleFileStack.size() == 0)
|
||||
TopFileIsModule = true;
|
||||
return;
|
||||
}
|
||||
|
||||
ModuleFileStack.push_back(FileName);
|
||||
if (ASTReader::readASTFileControlBlock(FileName, CI.getFileManager(),
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef A_H
|
||||
#define A_H
|
||||
|
||||
template <typename T>
|
||||
struct A {
|
||||
template <typename I>
|
||||
A(I i1, I i2) {
|
||||
}
|
||||
A(double) {}
|
||||
A(double, double) {}
|
||||
};
|
||||
|
||||
template <typename T1, typename T2>
|
||||
T1 fff(T2* t) {
|
||||
return T1(t, t);
|
||||
}
|
||||
|
||||
inline A<int> ff(int i) {
|
||||
return fff<A<int>>(&i);
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,6 @@
|
|||
#ifndef B_H
|
||||
#define B_H
|
||||
|
||||
#include "a.h"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,7 @@
|
|||
#ifndef C_H
|
||||
#define C_H
|
||||
|
||||
#include "a.h"
|
||||
#include "b.h"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,13 @@
|
|||
module "a" {
|
||||
textual header "a.h"
|
||||
}
|
||||
|
||||
module "b" {
|
||||
export *
|
||||
header "b.h"
|
||||
}
|
||||
|
||||
module "c" {
|
||||
export *
|
||||
header "c.h"
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
// RUN: rm -rf %t
|
||||
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-name=b -o %t/b.pcm -fmodule-maps \
|
||||
// RUN: -emit-module %S/Inputs/merge-decl-context/merge-decl-context.modulemap -I%S/Inputs \
|
||||
// RUN: -I %S/Inputs/merge-decl-context
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-name=c -o %t/c.pcm -fmodule-maps \
|
||||
// RUN: -fmodule-file=%t/b.pcm \
|
||||
// RUN: -emit-module %S/Inputs/merge-decl-context/merge-decl-context.modulemap -I%S/Inputs \
|
||||
// RUN: -I %S/Inputs/merge-decl-context
|
||||
|
||||
// Use the two modules in a single compile.
|
||||
// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-file=%t/c.pcm -fmodule-file=%t/b.pcm \
|
||||
// RUN: -fmodule-map-file=%S/Inputs/merge-decl-context/merge-decl-context.modulemap -I%S/Inputs \
|
||||
// RUN: -emit-llvm -o %t/test.o %s
|
||||
|
||||
#include "Inputs/merge-decl-context/a.h"
|
||||
#include "Inputs/merge-decl-context/b.h"
|
||||
#include "Inputs/merge-decl-context/c.h"
|
||||
|
||||
void t() {
|
||||
ff(42);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue