diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-06-05 23:44:51 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-06-05 23:44:51 +0000 |
commit | c65e1598ad69d2db2ce09c59427e456c47f6ae73 (patch) | |
tree | 800835926015663a32eb8cea7d4e306186caba4b | |
parent | c4392d2ad0f1deaff90fe2035e55611d3e373568 (diff) | |
download | bcm5719-llvm-c65e1598ad69d2db2ce09c59427e456c47f6ae73.tar.gz bcm5719-llvm-c65e1598ad69d2db2ce09c59427e456c47f6ae73.zip |
A non-explicit constructor template with a second parameter that is a
parameter pack is a converting constructor. Fixes PR13003.
llvm-svn: 158040
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 4 | ||||
-rw-r--r-- | clang/test/CXX/special/class.conv/class.conv.ctor/p1.cpp | 21 |
2 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 0c78abb8135..571ad4b39c1 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -1695,7 +1695,9 @@ bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const { return (getNumParams() == 0 && getType()->getAs<FunctionProtoType>()->isVariadic()) || (getNumParams() == 1) || - (getNumParams() > 1 && getParamDecl(1)->hasDefaultArg()); + (getNumParams() > 1 && + (getParamDecl(1)->hasDefaultArg() || + getParamDecl(1)->isParameterPack())); } bool CXXConstructorDecl::isSpecializationCopyingObject() const { diff --git a/clang/test/CXX/special/class.conv/class.conv.ctor/p1.cpp b/clang/test/CXX/special/class.conv/class.conv.ctor/p1.cpp new file mode 100644 index 00000000000..d2add82f420 --- /dev/null +++ b/clang/test/CXX/special/class.conv/class.conv.ctor/p1.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -std=c++11 %s -verify + +namespace PR13003 { + struct void_type + { + template <typename Arg0, typename... Args> + void_type(Arg0&&, Args&&...) { } + }; + + struct void_type2 + { + template <typename... Args> + void_type2(Args&&...) { } + }; + + struct atom { }; + + void_type v1 = atom(); + void_type2 v2 = atom(); +} + |