r310691 - PR33489: A function-style cast to a deduced class template specialization type is type-dependent if it can't be resolved due to a type-dependent argument.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 10 19:04:19 PDT 2017
Author: rsmith
Date: Thu Aug 10 19:04:19 2017
New Revision: 310691
URL: http://llvm.org/viewvc/llvm-project?rev=310691&view=rev
Log:
PR33489: A function-style cast to a deduced class template specialization type is type-dependent if it can't be resolved due to a type-dependent argument.
Modified:
cfe/trunk/lib/AST/ExprCXX.cpp
cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
Modified: cfe/trunk/lib/AST/ExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=310691&r1=310690&r2=310691&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprCXX.cpp (original)
+++ cfe/trunk/lib/AST/ExprCXX.cpp Thu Aug 10 19:04:19 2017
@@ -1052,7 +1052,9 @@ CXXUnresolvedConstructExpr::CXXUnresolve
:Type->getType()->isRValueReferenceType()? VK_XValue
:VK_RValue),
OK_Ordinary,
- Type->getType()->isDependentType(), true, true,
+ Type->getType()->isDependentType() ||
+ Type->getType()->getContainedDeducedType(),
+ true, true,
Type->getType()->containsUnexpandedParameterPack()),
Type(Type),
LParenLoc(LParenLoc),
Modified: cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp?rev=310691&r1=310690&r2=310691&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp Thu Aug 10 19:04:19 2017
@@ -286,6 +286,29 @@ namespace tuple_tests {
}
}
+namespace dependent {
+ template<typename T> struct X {
+ X(T);
+ };
+ template<typename T> int Var(T t) {
+ X x(t);
+ return X(x) + 1; // expected-error {{invalid operands}}
+ }
+ template<typename T> int Cast(T t) {
+ return X(X(t)) + 1; // expected-error {{invalid operands}}
+ }
+ template<typename T> int New(T t) {
+ return X(new X(t)) + 1; // expected-error {{invalid operands}}
+ };
+ template int Var(float); // expected-note {{instantiation of}}
+ template int Cast(float); // expected-note {{instantiation of}}
+ template int New(float); // expected-note {{instantiation of}}
+ template<typename T> int operator+(X<T>, int);
+ template int Var(int);
+ template int Cast(int);
+ template int New(int);
+}
+
#else
// expected-no-diagnostics
More information about the cfe-commits
mailing list