summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2009-12-03 04:06:58 +0000
committerJohn McCall <rjmccall@apple.com>2009-12-03 04:06:58 +0000
commit6e9f8f63743495e7a4e07b06e0209560661e5c8d (patch)
tree32e3c55dd0f4dff13fc7ae6b019e9a6254b2455e /clang/lib/Sema/SemaDeclCXX.cpp
parente2d4a2c3a8a6869e088e9ad226bedf6a269b238b (diff)
downloadbcm5719-llvm-6e9f8f63743495e7a4e07b06e0209560661e5c8d.tar.gz
bcm5719-llvm-6e9f8f63743495e7a4e07b06e0209560661e5c8d.zip
Honor using declarations in overload resolution. Most of the code for
overloaded-operator resolution is wildly untested, but the parallel code for methods seems to satisfy some trivial tests. Also change some overload-resolution APIs to take a type instead of an expression, which lets us avoid creating a spurious CXXThisExpr when resolving implicit member accesses. llvm-svn: 90410
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 37681719aaa..20cc290b18b 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -3906,23 +3906,28 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType,
= T2RecordDecl->getVisibleConversionFunctions();
for (UnresolvedSet::iterator I = Conversions->begin(),
E = Conversions->end(); I != E; ++I) {
+ NamedDecl *D = *I;
+ CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
+ if (isa<UsingShadowDecl>(D))
+ D = cast<UsingShadowDecl>(D)->getTargetDecl();
+
FunctionTemplateDecl *ConvTemplate
- = dyn_cast<FunctionTemplateDecl>(*I);
+ = dyn_cast<FunctionTemplateDecl>(D);
CXXConversionDecl *Conv;
if (ConvTemplate)
Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
else
- Conv = cast<CXXConversionDecl>(*I);
+ Conv = cast<CXXConversionDecl>(D);
// If the conversion function doesn't return a reference type,
// it can't be considered for this conversion.
if (Conv->getConversionType()->isLValueReferenceType() &&
(AllowExplicit || !Conv->isExplicit())) {
if (ConvTemplate)
- AddTemplateConversionCandidate(ConvTemplate, Init, DeclType,
- CandidateSet);
+ AddTemplateConversionCandidate(ConvTemplate, ActingDC,
+ Init, DeclType, CandidateSet);
else
- AddConversionCandidate(Conv, Init, DeclType, CandidateSet);
+ AddConversionCandidate(Conv, ActingDC, Init, DeclType, CandidateSet);
}
}
OpenPOWER on IntegriCloud