aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaOverload.cpp
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2012-03-20 21:24:14 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2012-03-20 21:24:14 +0000
commit1cd89c4d60d7a458de733a4ea81d5580df82a652 (patch)
treea98162aff857d203484b9088bb1f1d79e31dee90 /lib/Sema/SemaOverload.cpp
parentca8937111cccdbf7d17c349487a332d6c7c97f91 (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.cpp26
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);
}
}
}