diff options
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 38 | 
1 files changed, 30 insertions, 8 deletions
| diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index f45893df86d..e601a7d328c 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -3391,17 +3391,39 @@ static ExprResult CopyObject(Sema &S,    OverloadCandidateSet CandidateSet(Loc);    for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class);         Con != ConEnd; ++Con) { -    // Only consider copy constructors. -    CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(*Con); -    if (!Constructor || Constructor->isInvalidDecl() || -        !Constructor->isCopyConstructor() || -        !Constructor->isConvertingConstructor(/*AllowExplicit=*/false)) +    // Only consider copy constructors and constructor templates. +    CXXConstructorDecl *Constructor = 0; + +    if ((Constructor = dyn_cast<CXXConstructorDecl>(*Con))) { +      // Handle copy constructors, only. +      if (!Constructor || Constructor->isInvalidDecl() || +          !Constructor->isCopyConstructor() || +          !Constructor->isConvertingConstructor(/*AllowExplicit=*/false)) +        continue; + +      DeclAccessPair FoundDecl +        = DeclAccessPair::make(Constructor, Constructor->getAccess()); +      S.AddOverloadCandidate(Constructor, FoundDecl, +                             &CurInitExpr, 1, CandidateSet); +      continue; +    }  + +    // Handle constructor templates. +    FunctionTemplateDecl *ConstructorTmpl = cast<FunctionTemplateDecl>(*Con); +    if (ConstructorTmpl->isInvalidDecl()) +      continue; + +    Constructor = cast<CXXConstructorDecl>( +                                         ConstructorTmpl->getTemplatedDecl()); +    if (!Constructor->isConvertingConstructor(/*AllowExplicit=*/false))        continue; +    // FIXME: Do we need to limit this to copy-constructor-like +    // candidates?      DeclAccessPair FoundDecl -      = DeclAccessPair::make(Constructor, Constructor->getAccess()); -    S.AddOverloadCandidate(Constructor, FoundDecl, -                           &CurInitExpr, 1, CandidateSet); +      = DeclAccessPair::make(ConstructorTmpl, ConstructorTmpl->getAccess()); +    S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, 0, +                                   &CurInitExpr, 1, CandidateSet, true);    }    OverloadCandidateSet::iterator Best; | 

