diff options
author | Hans Wennborg <hans@hanshq.net> | 2017-08-11 15:58:58 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2017-08-11 15:58:58 +0000 |
commit | 9ae15462ce434ac27321fd104c2969941fc70b71 (patch) | |
tree | 82cd4eb3b5fb5869ec1b1c4289475ba0191a86b9 | |
parent | 4af01079ce2f2d2528d72b8ce5be018f68ea7d73 (diff) |
Merging r310691:
------------------------------------------------------------------------
r310691 | rsmith | 2017-08-10 19:04:19 -0700 (Thu, 10 Aug 2017) | 2 lines
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.
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_50@310719 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/ExprCXX.cpp | 4 | ||||
-rw-r--r-- | test/SemaCXX/cxx1z-class-template-argument-deduction.cpp | 23 |
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 6713fca045..fe45b5e47f 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -1052,7 +1052,9 @@ CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type, :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), diff --git a/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp b/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp index 668c242802..9232a8b6eb 100644 --- a/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ b/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -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 |