summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-02-25 08:52:25 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-02-25 08:52:25 +0000
commita28097da4fbae525909886f348046e24248fd4c0 (patch)
treec44e87ae78df72e914313f73e775be029992f873 /clang/lib
parentaa06169f7c6b838ed93bfb2e227f31c5605bab95 (diff)
downloadbcm5719-llvm-a28097da4fbae525909886f348046e24248fd4c0.tar.gz
bcm5719-llvm-a28097da4fbae525909886f348046e24248fd4c0.zip
Rough fix for PR9323 that prevents Clang from marking copy constructor
declarations as referenced when in fact we're not going to even form a call in the AST. This is significant because we attempt to allow as an extension classes with intentionally private and undefined copy constructors to have temporaries bound to references, and so shouldn't warn about the lack of definition for that copy constructor when the class is internal. Doug, John wasn't really satisfied with the presence of overloading at all. This is a stop-gap and there may be a better solution. If you can give me some hints for how you'd prefer to see this solved, I'll happily switch things over. llvm-svn: 126480
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaInit.cpp4
-rw-r--r--clang/lib/Sema/SemaOverload.cpp11
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;
OpenPOWER on IntegriCloud