diff options
-rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 16 | ||||
-rw-r--r-- | clang/test/Modules/submodules-merge-defs.cpp | 7 |
2 files changed, 15 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 75d4709e19b..3fd1f21ba3f 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -1228,13 +1228,17 @@ Module *Sema::getOwningModule(Decl *Entity) { } void Sema::makeMergedDefinitionVisible(NamedDecl *ND, SourceLocation Loc) { - // FIXME: If ND is a template declaration, make the template parameters - // visible too. They're not (necessarily) within its DeclContext. if (auto *M = PP.getModuleContainingLocation(Loc)) Context.mergeDefinitionIntoModule(ND, M); else // We're not building a module; just make the definition visible. ND->setHidden(false); + + // If ND is a template declaration, make the template parameters + // 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); } /// \brief Find the module in which the given declaration was defined. @@ -1296,8 +1300,12 @@ hasVisibleDefaultArgument(Sema &S, const ParmDecl *D, if (!DefaultArg.isInherited() && S.isVisible(D)) return true; - if (!DefaultArg.isInherited() && Modules) - Modules->push_back(S.getOwningModule(const_cast<ParmDecl*>(D))); + if (!DefaultArg.isInherited() && Modules) { + auto *NonConstD = const_cast<ParmDecl*>(D); + Modules->push_back(S.getOwningModule(NonConstD)); + const auto &Merged = S.Context.getModulesWithMergedDefinition(NonConstD); + Modules->insert(Modules->end(), Merged.begin(), Merged.end()); + } // If there was a previous default argument, maybe its parameter is visible. D = DefaultArg.getInheritedFrom(); diff --git a/clang/test/Modules/submodules-merge-defs.cpp b/clang/test/Modules/submodules-merge-defs.cpp index a11ae46aefc..ee5e4fe1bfd 100644 --- a/clang/test/Modules/submodules-merge-defs.cpp +++ b/clang/test/Modules/submodules-merge-defs.cpp @@ -50,12 +50,11 @@ int pre_fg = F<int>().g<int>(); // expected-error +{{must be imported}} J<> pre_j; // expected-error {{declaration of 'J' must be imported}} #ifdef IMPORT_USE_2 -// FIXME-error-re@-2 {{default argument of 'J' must be imported from one of {{.*}}stuff.use{{.*}}stuff.use-2}} -// expected-error@-3 {{default argument of 'J' must be imported from module 'stuff.use'}} +// expected-error-re@-2 {{default argument of 'J' must be imported from one of {{.*}}stuff.use{{.*}}stuff.use-2}} #elif EARLY_INDIRECT_INCLUDE -// expected-error@-5 {{default argument of 'J' must be imported from module 'merged-defs'}} +// expected-error@-4 {{default argument of 'J' must be imported from module 'merged-defs'}} #else -// expected-error@-7 {{default argument of 'J' must be imported from module 'stuff.use'}} +// expected-error@-6 {{default argument of 'J' must be imported from module 'stuff.use'}} #endif // expected-note@defs.h:49 +{{here}} |