r293350 - When converting a template argument representing &array to an expression for a
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 27 16:38:36 PST 2017
Author: rsmith
Date: Fri Jan 27 18:38:35 2017
New Revision: 293350
URL: http://llvm.org/viewvc/llvm-project?rev=293350&view=rev
Log:
When converting a template argument representing &array to an expression for a
pointer typed template parameter, form &array rather than an array-to-pointer
decay on array.
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=293350&r1=293349&r2=293350&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Fri Jan 27 18:38:35 2017
@@ -5830,8 +5830,9 @@ Sema::BuildExpressionFromDeclTemplateArg
if (RefExpr.isInvalid())
return ExprError();
- if (T->isFunctionType() || T->isArrayType()) {
- // Decay functions and arrays.
+ if (!Context.hasSameUnqualifiedType(ParamType->getPointeeType(), T) &&
+ (T->isFunctionType() || T->isArrayType())) {
+ // Decay functions and arrays unless we're forming a pointer to array.
RefExpr = DefaultFunctionArrayConversion(RefExpr.get());
if (RefExpr.isInvalid())
return ExprError();
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=293350&r1=293349&r2=293350&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp (original)
+++ cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp Fri Jan 27 18:38:35 2017
@@ -455,3 +455,11 @@ namespace nondependent_default_arg_order
X<int *, &m> y; f(y); // expected-error {{ambiguous}}
}
}
+
+namespace pointer_to_char_array {
+ typedef char T[4];
+ template<T *P> struct A { void f(); };
+ template<T *P> void A<P>::f() {}
+ T foo = "foo";
+ void g() { A<&foo>().f(); }
+}
More information about the cfe-commits
mailing list