r373643 - PR43547: substitute into the type of a non-type template parameter if
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 3 11:24:40 PDT 2019
Author: rsmith
Date: Thu Oct 3 11:24:40 2019
New Revision: 373643
URL: http://llvm.org/viewvc/llvm-project?rev=373643&view=rev
Log:
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.
Modified:
cfe/trunk/lib/Sema/SemaTemplate.cpp
cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=373643&r1=373642&r2=373643&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Thu Oct 3 11:24:40 2019
@@ -4922,9 +4922,7 @@ bool Sema::CheckTemplateArgument(NamedDe
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.
Modified: cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp?rev=373643&r1=373642&r2=373643&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp (original)
+++ cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp Thu Oct 3 11:24:40 2019
@@ -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}}
+}
More information about the cfe-commits
mailing list