diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-08-27 23:35:55 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-08-27 23:35:55 +0000 |
| commit | 6a1f965853df1fccd0c898ed0e89d243e36fbea6 (patch) | |
| tree | 9ed50415315ae4ec19256cc3dd70207c8c72ab09 /clang/lib/Sema/SemaOverload.cpp | |
| parent | 7ef882dca03568e87372356025e41a3131d37f57 (diff) | |
| download | bcm5719-llvm-6a1f965853df1fccd0c898ed0e89d243e36fbea6.tar.gz bcm5719-llvm-6a1f965853df1fccd0c898ed0e89d243e36fbea6.zip | |
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.
llvm-svn: 80302
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 5c92e12f697..7e00a1ecd84 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/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); |

