Hi Hans, this fixes a bug you wanted to treat as a 5.0 release blocker, so should be ported to the branch :)
On 10 August 2017 at 19:04, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote: > 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 >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits