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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits