diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2012-03-20 21:24:14 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2012-03-20 21:24:14 +0000 |
commit | 1cd89c4d60d7a458de733a4ea81d5580df82a652 (patch) | |
tree | a98162aff857d203484b9088bb1f1d79e31dee90 /lib/Sema/SemaOverload.cpp | |
parent | ca8937111cccdbf7d17c349487a332d6c7c97f91 (diff) |
More careful consideration of C++11 13.3.3.1p4. Fixes PR12257.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153130 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index b93fb093fa..ff227eee6e 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -2904,22 +2904,34 @@ IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType, else Usable = Usable &&Constructor->isConvertingConstructor(AllowExplicit); if (Usable) { + bool SuppressUserConversions = !ConstructorsOnly; + if (SuppressUserConversions && ListInitializing) { + SuppressUserConversions = false; + if (NumArgs == 1) { + // If the first argument is (a reference to) the target type, + // suppress conversions. + const FunctionProtoType *CtorType = + Constructor->getType()->getAs<FunctionProtoType>(); + if (CtorType->getNumArgs() > 0) { + QualType FirstArg = CtorType->getArgType(0); + if (S.Context.hasSameUnqualifiedType(ToType, + FirstArg.getNonReferenceType())) { + SuppressUserConversions = true; + } + } + } + } if (ConstructorTmpl) S.AddTemplateOverloadCandidate(ConstructorTmpl, FoundDecl, /*ExplicitArgs*/ 0, llvm::makeArrayRef(Args, NumArgs), - CandidateSet, - /*SuppressUserConversions=*/ - !ConstructorsOnly && - !ListInitializing); + CandidateSet, SuppressUserConversions); else // Allow one user-defined conversion when user specifies a // From->ToType conversion via an static cast (c-style, etc). S.AddOverloadCandidate(Constructor, FoundDecl, llvm::makeArrayRef(Args, NumArgs), - CandidateSet, - /*SuppressUserConversions=*/ - !ConstructorsOnly && !ListInitializing); + CandidateSet, SuppressUserConversions); } } } |