diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 11 |
2 files changed, 12 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 6a1bc97de79..d43ce5bb49c 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -3478,7 +3478,9 @@ static ExprResult CopyObject(Sema &S, } OverloadCandidateSet::iterator Best; - switch (CandidateSet.BestViableFunction(S, Loc, Best)) { + switch (CandidateSet.BestViableFunction(S, Loc, Best, + /*UserDefinedConversion=*/ false, + IsExtraneousCopy)) { case OR_Success: break; diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 60873cd969d..c59bfec8116 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -6248,7 +6248,8 @@ isBetterOverloadCandidate(Sema &S, OverloadingResult OverloadCandidateSet::BestViableFunction(Sema &S, SourceLocation Loc, iterator &Best, - bool UserDefinedConversion) { + bool UserDefinedConversion, + bool IsExtraneousCopy) { // Find the best viable function. Best = end(); for (iterator Cand = begin(); Cand != end(); ++Cand) { @@ -6286,7 +6287,13 @@ OverloadCandidateSet::BestViableFunction(Sema &S, SourceLocation Loc, // covers calls to named functions (5.2.2), operator overloading // (clause 13), user-defined conversions (12.3.2), allocation function for // placement new (5.3.4), as well as non-default initialization (8.5). - if (Best->Function) + // + // As a special exception, we don't mark functions selected for extraneous + // copy constructor calls as used; the nature of extraneous copy constructor + // calls is that they are never in fact called. + // FIXME: This doesn't seem like the right approach. Should we be doing + // overload resolution at all for extraneous copies? + if (Best->Function && !IsExtraneousCopy) S.MarkDeclarationReferenced(Loc, Best->Function); return OR_Success; |

