]> granicus.if.org Git - clang/commitdiff
[modules] If we merge a template, also track that its parameters are merged so
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 17 Jun 2015 20:39:41 +0000 (20:39 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 17 Jun 2015 20:39:41 +0000 (20:39 +0000)
that we know when its default arguments should be visible.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239936 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaLookup.cpp
test/Modules/submodules-merge-defs.cpp

index 75d4709e19b2613edc7ee6f266a1c3278f40def9..3fd1f21ba3fdfb447ca5ebad8090f77bb92fc789 100644 (file)
@@ -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();
index a11ae46aefc3d5003901b8715d91e11445ede7e0..ee5e4fe1bfd50320f3e6704240a234831e3e2245 100644 (file)
@@ -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}}