r358795 - Modules: Search for a visible definition of the decl context when computing visibility of a default template parameter

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 19 16:02:31 PDT 2019


Author: dblaikie
Date: Fri Apr 19 16:02:30 2019
New Revision: 358795

URL: http://llvm.org/viewvc/llvm-project?rev=358795&view=rev
Log:
Modules: Search for a visible definition of the decl context when computing visibility of a default template parameter

The code is/was already correct for the case where a parameter is a
parameter of its enclosing lexical DeclContext (functions and classes).
But for other templates (alias and variable templates) they don't create
their own scope to be members of - in those cases, they parameter should
be considered visible if any definition of the lexical decl context is
visible.

[this should cleanup the failure on the libstdc++ modules buildbot]
[this doesn't actually fix the variable template case for a
secondary/compounding reason (its lexical decl context is incorrectly
considered to be the translation unit)]

Test covers all 4 kinds of templates with default args, including a
regression test for the still broken variable template case.

Reviewers: rsmith

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

Added:
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias1.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias2.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func1.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func2.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/module.modulemap
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct1.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct2.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var1.h
    cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var2.h
    cfe/trunk/test/Modules/nested-template-default-arg-redecl.cpp
Modified:
    cfe/trunk/lib/Sema/SemaLookup.cpp

Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=358795&r1=358794&r2=358795&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Fri Apr 19 16:02:30 2019
@@ -1543,8 +1543,21 @@ bool LookupResult::isVisibleSlow(Sema &S
     // and in C we must not because each declaration of a function gets its own
     // set of declarations for tags in prototype scope.
     bool VisibleWithinParent;
-    if (D->isTemplateParameter() || isa<ParmVarDecl>(D) ||
-        (isa<FunctionDecl>(DC) && !SemaRef.getLangOpts().CPlusPlus))
+    if (D->isTemplateParameter()) {
+      bool SearchDefinitions = true;
+      if (const auto *DCD = dyn_cast<Decl>(DC)) {
+        if (const auto *TD = DCD->getDescribedTemplate()) {
+          TemplateParameterList *TPL = TD->getTemplateParameters();
+          auto Index = getDepthAndIndex(D).second;
+          SearchDefinitions = Index >= TPL->size() || TPL->getParam(Index) != D;
+        }
+      }
+      if (SearchDefinitions)
+        VisibleWithinParent = SemaRef.hasVisibleDefinition(cast<NamedDecl>(DC));
+      else
+        VisibleWithinParent = isVisible(SemaRef, cast<NamedDecl>(DC));
+    } else if (isa<ParmVarDecl>(D) ||
+               (isa<FunctionDecl>(DC) && !SemaRef.getLangOpts().CPlusPlus))
       VisibleWithinParent = isVisible(SemaRef, cast<NamedDecl>(DC));
     else if (D->isModulePrivate()) {
       // A module-private declaration is only visible if an enclosing lexical

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1,7 @@
+#ifndef ALIAS_H
+#define ALIAS_H
+struct alias_outer {
+  template <typename = int>
+  using alias = int;
+};
+#endif

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias1.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias1.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias1.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "alias.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias2.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias2.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/alias2.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "alias.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1,7 @@
+#ifndef FUNC_H
+#define FUNC_H
+struct func_outer {
+  template <typename = int>
+  void func();
+};
+#endif

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func1.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func1.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func1.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "func.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func2.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func2.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/func2.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "func.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/module.modulemap
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/module.modulemap?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/module.modulemap (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/module.modulemap Fri Apr 19 16:02:30 2019
@@ -0,0 +1,24 @@
+module ALIAS1 {
+  header "alias1.h"
+  module ALIAS2 {
+    header "alias2.h"
+  }
+}
+module VAR1 {
+  header "var1.h"
+  module VAR2 {
+    header "var2.h"
+  }
+}
+module FUNC1 {
+  header "func1.h"
+  module FUNC2 {
+    header "func2.h"
+  }
+}
+module STRCT1 {
+  header "strct1.h"
+  module STRCT2 {
+    header "strct2.h"
+  }
+}

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1,7 @@
+#ifndef STRCT_H
+#define STRCT_H
+struct strct_outer {
+  template <typename = int>
+  struct strct;
+};
+#endif

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct1.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct1.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct1.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "strct.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct2.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct2.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/strct2.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "strct.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1,9 @@
+#ifndef VAR_H
+#define VAR_H
+struct var_outer {
+  template <typename = int>
+  static int var;
+};
+#endif
+
+

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var1.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var1.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var1.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "var.h"

Added: cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var2.h?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var2.h (added)
+++ cfe/trunk/test/Modules/Inputs/nested-template-default-arg-redecl/var2.h Fri Apr 19 16:02:30 2019
@@ -0,0 +1 @@
+#include "var.h"

Added: cfe/trunk/test/Modules/nested-template-default-arg-redecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/nested-template-default-arg-redecl.cpp?rev=358795&view=auto
==============================================================================
--- cfe/trunk/test/Modules/nested-template-default-arg-redecl.cpp (added)
+++ cfe/trunk/test/Modules/nested-template-default-arg-redecl.cpp Fri Apr 19 16:02:30 2019
@@ -0,0 +1,18 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -x c++ -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \
+// RUN:     -I %S/Inputs/nested-template-default-arg-redecl -std=c++14 \
+// RUN:     -fmodules-local-submodule-visibility -verify %s
+#include "alias2.h"
+#include "var2.h"
+#include "strct2.h"
+#include "func2.h"
+
+// FIXME: Variable templates lexical decl context appears to be the translation
+// unit, which is incorrect. Fixing this will hopefully address the following
+// error/bug:
+
+// expected-note at Inputs/nested-template-default-arg-redecl/var.h:4 {{default argument declared here}}
+auto var = &var_outer::var<>; // expected-error {{default argument of 'var' must be imported from module 'VAR1' before it is required}}
+auto func = &func_outer::func<>;
+strct_outer::strct<> *strct;
+alias_outer::alias<> *alias;




More information about the cfe-commits mailing list