aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-08-27 23:35:55 +0000
committerDouglas Gregor <dgregor@apple.com>2009-08-27 23:35:55 +0000
commit8a5ae2401645788144c0ae769a2fb899866801f5 (patch)
tree1c0a551cc8f2cb76a80226c84ffc7a5a73cf1349 /lib
parent9058f90e31436826164529d2942a0cb7c85fd1e6 (diff)
When looking for overloaded member operators, make sure to instantiate
class template specializations (when possible) and look into base classes. Thanks to Eli for the test case! FIXME -=1. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80302 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Sema/SemaOverload.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 5c92e12f69..7e00a1ecd8 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -2638,11 +2638,17 @@ void Sema::AddMemberOperatorCandidates(OverloadedOperatorKind Op,
// result of the qualified lookup of T1::operator@
// (13.3.1.1.1); otherwise, the set of member candidates is
// empty.
- // FIXME: Lookup in base classes, too!
if (const RecordType *T1Rec = T1->getAs<RecordType>()) {
- DeclContext::lookup_const_iterator Oper, OperEnd;
- for (llvm::tie(Oper, OperEnd) = T1Rec->getDecl()->lookup(OpName);
- Oper != OperEnd; ++Oper)
+ // Complete the type if it can be completed. Otherwise, we're done.
+ if (RequireCompleteType(OpLoc, T1, PartialDiagnostic(0)))
+ return;
+
+ LookupResult Operators = LookupQualifiedName(T1Rec->getDecl(), OpName,
+ LookupOrdinaryName, false);
+ for (LookupResult::iterator Oper = Operators.begin(),
+ OperEnd = Operators.end();
+ Oper != OperEnd;
+ ++Oper)
AddMethodCandidate(cast<CXXMethodDecl>(*Oper), Args[0],
Args+1, NumArgs - 1, CandidateSet,
/*SuppressUserConversions=*/false);