]> granicus.if.org Git - clang/commitdiff
When looking for overloaded member operators, make sure to instantiate
authorDouglas Gregor <dgregor@apple.com>
Thu, 27 Aug 2009 23:35:55 +0000 (23:35 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 27 Aug 2009 23:35:55 +0000 (23:35 +0000)
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

include/clang/AST/DeclCXX.h
lib/Sema/SemaOverload.cpp
test/SemaCXX/overloaded-operator.cpp

index abcb9634bacd7dc1e025c6a94712d59f2146fd10..b08a51f016aa1e6beb88fe1f2f2762350d8448db 100644 (file)
@@ -514,7 +514,9 @@ public:
   /// user-declared constructors. When true, a default constructor
   /// will not be implicitly declared.
   bool hasUserDeclaredConstructor() const { 
-    assert(isDefinition() && "Incomplete record decl!");
+    assert((isDefinition() ||
+            cast<RecordType>(getTypeForDecl())->isBeingDefined()) && 
+           "Incomplete record decl!");
     return UserDeclaredConstructor;
   }
 
index 5c92e12f6973adcb2035d8ec520f6373f2e48e43..7e00a1ecd84586db11c02ccc837cda7340383b89 100644 (file)
@@ -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);
index 916d753a3ff59a574ab0ba0555d8a942c78f3a60..02b47bd7b1973ed4c48aeffac086bbb5618fb4f2 100644 (file)
@@ -209,3 +209,7 @@ namespace M {
     (void)(x + x);
   }
 }
+
+struct AA { bool operator!=(AA&); };
+struct BB : AA {};
+bool x(BB y, BB z) { return y != z; }