diff options
Diffstat (limited to 'lib/Sema/SemaLookup.cpp')
| -rw-r--r-- | lib/Sema/SemaLookup.cpp | 52 | 
1 files changed, 35 insertions, 17 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index ce76e14982db..c5b579a4b2e9 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -1382,8 +1382,8 @@ Module *Sema::getOwningModule(Decl *Entity) {    return M;  } -void Sema::makeMergedDefinitionVisible(NamedDecl *ND, SourceLocation Loc) { -  if (auto *M = PP.getModuleContainingLocation(Loc)) +void Sema::makeMergedDefinitionVisible(NamedDecl *ND) { +  if (auto *M = getCurrentModule())      Context.mergeDefinitionIntoModule(ND, M);    else      // We're not building a module; just make the definition visible. @@ -1393,7 +1393,7 @@ void Sema::makeMergedDefinitionVisible(NamedDecl *ND, SourceLocation Loc) {    // visible too. They're not (necessarily) within a mergeable DeclContext.    if (auto *TD = dyn_cast<TemplateDecl>(ND))      for (auto *Param : *TD->getTemplateParameters()) -      makeMergedDefinitionVisible(Param, Loc); +      makeMergedDefinitionVisible(Param);  }  /// \brief Find the module in which the given declaration was defined. @@ -3445,7 +3445,8 @@ static void LookupVisibleDecls(DeclContext *Ctx, LookupResult &Result,                                 bool QualifiedNameLookup,                                 bool InBaseClass,                                 VisibleDeclConsumer &Consumer, -                               VisibleDeclsRecord &Visited) { +                               VisibleDeclsRecord &Visited, +                               bool IncludeDependentBases = false) {    if (!Ctx)      return; @@ -3501,7 +3502,8 @@ static void LookupVisibleDecls(DeclContext *Ctx, LookupResult &Result,      ShadowContextRAII Shadow(Visited);      for (auto I : Ctx->using_directives()) {        LookupVisibleDecls(I->getNominatedNamespace(), Result, -                         QualifiedNameLookup, InBaseClass, Consumer, Visited); +                         QualifiedNameLookup, InBaseClass, Consumer, Visited, +                         IncludeDependentBases);      }    } @@ -3513,14 +3515,28 @@ static void LookupVisibleDecls(DeclContext *Ctx, LookupResult &Result,      for (const auto &B : Record->bases()) {        QualType BaseType = B.getType(); -      // Don't look into dependent bases, because name lookup can't look -      // there anyway. -      if (BaseType->isDependentType()) -        continue; - -      const RecordType *Record = BaseType->getAs<RecordType>(); -      if (!Record) -        continue; +      RecordDecl *RD; +      if (BaseType->isDependentType()) { +        if (!IncludeDependentBases) { +          // Don't look into dependent bases, because name lookup can't look +          // there anyway. +          continue; +        } +        const auto *TST = BaseType->getAs<TemplateSpecializationType>(); +        if (!TST) +          continue; +        TemplateName TN = TST->getTemplateName(); +        const auto *TD = +            dyn_cast_or_null<ClassTemplateDecl>(TN.getAsTemplateDecl()); +        if (!TD) +          continue; +        RD = TD->getTemplatedDecl(); +      } else { +        const auto *Record = BaseType->getAs<RecordType>(); +        if (!Record) +          continue; +        RD = Record->getDecl(); +      }        // FIXME: It would be nice to be able to determine whether referencing        // a particular member would be ambiguous. For example, given @@ -3543,8 +3559,8 @@ static void LookupVisibleDecls(DeclContext *Ctx, LookupResult &Result,        // Find results in this base class (and its bases).        ShadowContextRAII Shadow(Visited); -      LookupVisibleDecls(Record->getDecl(), Result, QualifiedNameLookup, -                         true, Consumer, Visited); +      LookupVisibleDecls(RD, Result, QualifiedNameLookup, true, Consumer, +                         Visited, IncludeDependentBases);      }    } @@ -3713,7 +3729,8 @@ void Sema::LookupVisibleDecls(Scope *S, LookupNameKind Kind,  void Sema::LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,                                VisibleDeclConsumer &Consumer, -                              bool IncludeGlobalScope) { +                              bool IncludeGlobalScope, +                              bool IncludeDependentBases) {    LookupResult Result(*this, DeclarationName(), SourceLocation(), Kind);    Result.setAllowHidden(Consumer.includeHiddenDecls());    VisibleDeclsRecord Visited; @@ -3721,7 +3738,8 @@ void Sema::LookupVisibleDecls(DeclContext *Ctx, LookupNameKind Kind,      Visited.visitedContext(Context.getTranslationUnitDecl());    ShadowContextRAII Shadow(Visited);    ::LookupVisibleDecls(Ctx, Result, /*QualifiedNameLookup=*/true, -                       /*InBaseClass=*/false, Consumer, Visited); +                       /*InBaseClass=*/false, Consumer, Visited, +                       IncludeDependentBases);  }  /// LookupOrCreateLabel - Do a name lookup of a label with the specified name.  | 
