Эх сурвалжийг харах

PR43547: substitute into the type of a non-type template parameter if
it's instantiation-dependent, even if it's not dependent.

There might be a SFINAE check in the parameter type.

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

Richard Smith 5 жил өмнө
parent
commit
cf3ce1cf84

+ 1 - 3
lib/Sema/SemaTemplate.cpp

@@ -4922,9 +4922,7 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,
     if (NTTP->isParameterPack() && NTTP->isExpandedParameterPack())
       NTTPType = NTTP->getExpansionType(ArgumentPackIndex);
 
-    // FIXME: Do we need to substitute into parameters here if they're
-    // instantiation-dependent but not dependent?
-    if (NTTPType->isDependentType() &&
+    if (NTTPType->isInstantiationDependentType() &&
         !isa<TemplateTemplateParmDecl>(Template) &&
         !Template->getDeclContext()->isDependentContext()) {
       // Do substitution on the type of the non-type template parameter.

+ 12 - 0
test/SemaTemplate/temp_arg_nontype.cpp

@@ -482,3 +482,15 @@ namespace dependent_backreference {
   template<short S> void a() { X<short, S, &arr> x; }
   template<short S> void b() { X<int, S, &arr> x; } // expected-note {{substituting}}
 }
+
+namespace instantiation_dependent {
+  template<typename T, __typeof(sizeof(T))> void f(int);
+  template<typename T, __typeof(sizeof(0))> int &f(...);
+  int &rf = f<struct incomplete, 0>(0);
+
+  // FIXME: This fails because we mishandle instantiation-dependent array bounds :(
+  int arr[sizeof(sizeof(int))];
+  template<typename T, int (*)[sizeof(sizeof(T))]> void g(int);
+  template<typename T, int (*)[sizeof(sizeof(int))]> int &g(...);
+  int &rg = g<struct incomplete, &arr>(0); // expected-error {{cannot bind}}
+}