]> granicus.if.org Git - clang/commitdiff
From Vassil Vassilev:
authorAxel Naumann <Axel.Naumann@cern.ch>
Thu, 24 Feb 2011 16:47:47 +0000 (16:47 +0000)
committerAxel Naumann <Axel.Naumann@cern.ch>
Thu, 24 Feb 2011 16:47:47 +0000 (16:47 +0000)
Add an interface for last resort, unqualified lookup. It can provide results for unqualified lookup when Sema fails to find anything itself.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126387 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Sema/ExternalSemaSource.h
lib/Sema/SemaLookup.cpp

index 6d7bc6316bd2808b348358bfec1a9da5efca2359..e2b083e8304749c80086dff2a5ecdd6193113d97 100644 (file)
@@ -20,6 +20,8 @@ namespace clang {
 
 struct ObjCMethodList;
 class Sema;
+class Scope;
+class LookupResult;
 
 /// \brief An abstract interface that should be implemented by
 /// external AST sources that also provide information for semantic
@@ -47,6 +49,16 @@ public:
   /// instance and factory methods, respectively, with this selector.
   virtual std::pair<ObjCMethodList,ObjCMethodList> ReadMethodPool(Selector Sel);
 
+  /// \brief Do last resort, unqualified lookup on a LookupResult that
+  /// Sema cannot find.
+  ///
+  /// \param R a LookupResult that is being recovered.
+  ///
+  /// \param S the Scope of the identifier occurrence.
+  ///
+  /// \return true to tell Sema to recover using the LookupResult.
+  virtual bool LookupUnqualified(LookupResult &R, Scope *S) { return false; }
+
   // isa/cast/dyn_cast support
   static bool classof(const ExternalASTSource *Source) {
     return Source->SemaSource;
index 0fd0e08ac83097163a67fae86ca20b2994a772ff..3deb4034c538e1ff5717e75b4dafda006aa4c367 100644 (file)
@@ -18,6 +18,7 @@
 #include "clang/Sema/Scope.h"
 #include "clang/Sema/ScopeInfo.h"
 #include "clang/Sema/TemplateDeduction.h"
+#include "clang/Sema/ExternalSemaSource.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/CXXInheritance.h"
 #include "clang/AST/Decl.h"
@@ -1132,7 +1133,11 @@ bool Sema::LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation) {
   if (AllowBuiltinCreation)
     return LookupBuiltin(*this, R);
 
-  return false;
+  // If we didn't find a use of this identifier, the ExternalSource 
+  // may be able to handle the situation. 
+  // Note: some lookup failures are expected!
+  // See e.g. R.isForRedeclaration().
+  return (ExternalSource && ExternalSource->LookupUnqualified(R, S));
 }
 
 /// @brief Perform qualified name lookup in the namespaces nominated by