]> granicus.if.org Git - clang/commitdiff
Avoid some unnecessary copying of unresolved lookup results.
authorJohn McCall <rjmccall@apple.com>
Tue, 26 Jan 2010 07:37:41 +0000 (07:37 +0000)
committerJohn McCall <rjmccall@apple.com>
Tue, 26 Jan 2010 07:37:41 +0000 (07:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94531 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ExprCXX.h
lib/Sema/SemaOverload.cpp

index 2b20b52b604d1399e8fde9bf00d915291a992cf2..ad3f4b1c91dd35c29ee4c4f24f6fe03a46e95872 100644 (file)
@@ -1149,6 +1149,9 @@ public:
   decls_iterator decls_begin() const { return Results.begin(); }
   decls_iterator decls_end() const { return Results.end(); }
 
+  /// Retrieves the decls as an unresolved set.
+  const UnresolvedSetImpl &getDecls() { return Results; }
+
   /// True if this declaration should be extended by
   /// argument-dependent lookup.
   bool requiresADL() const { return RequiresADL; }
@@ -1805,6 +1808,9 @@ public:
 
   unsigned getNumDecls() const { return Results.size(); }
 
+  /// Retrieves the decls as an unresolved set.
+  const UnresolvedSetImpl &getDecls() { return Results; }
+
   /// \brief True if this is an implicit access, i.e. one in which the
   /// member being accessed was not written in the source.  The source
   /// location of the operator is invalid in this case.
index 0fba0c62281c2bdea58b977013dbec26f7f49aa9..47a7d175196f435540bb51c3f38d04db08cf354f 100644 (file)
@@ -4903,36 +4903,34 @@ Sema::ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
 
   bool HasExplicitTemplateArgs = false;
   TemplateArgumentListInfo ExplicitTemplateArgs;
-
-  llvm::SmallVector<NamedDecl*,8> Fns;
+  const UnresolvedSetImpl *Fns;
   
   // Look into the overloaded expression.
   if (UnresolvedLookupExpr *UL
                = dyn_cast<UnresolvedLookupExpr>(OvlExpr)) {
-    Fns.append(UL->decls_begin(), UL->decls_end());
+    Fns = &UL->getDecls();
     if (UL->hasExplicitTemplateArgs()) {
       HasExplicitTemplateArgs = true;
       UL->copyTemplateArgumentsInto(ExplicitTemplateArgs);
     }
   } else if (UnresolvedMemberExpr *ME
                = dyn_cast<UnresolvedMemberExpr>(OvlExpr)) {
-    Fns.append(ME->decls_begin(), ME->decls_end());
+    Fns = &ME->getDecls();
     if (ME->hasExplicitTemplateArgs()) {
       HasExplicitTemplateArgs = true;
       ME->copyTemplateArgumentsInto(ExplicitTemplateArgs);
     }
-  }
+  } else return 0;
 
   // If we didn't actually find anything, we're done.
-  if (Fns.empty())
+  if (Fns->empty())
     return 0;
 
   // Look through all of the overloaded functions, searching for one
   // whose type matches exactly.
   llvm::SmallPtrSet<FunctionDecl *, 4> Matches;
   bool FoundNonTemplateFunction = false;
-  for (llvm::SmallVectorImpl<NamedDecl*>::iterator I = Fns.begin(),
-         E = Fns.end(); I != E; ++I) {
+  for (UnresolvedSetIterator I = Fns->begin(), E = Fns->end(); I != E; ++I) {
     // Look through any using declarations to find the underlying function.
     NamedDecl *Fn = (*I)->getUnderlyingDecl();
 
@@ -5088,35 +5086,33 @@ FunctionDecl *Sema::ResolveSingleFunctionTemplateSpecialization(Expr *From) {
   
   bool HasExplicitTemplateArgs = false;
   TemplateArgumentListInfo ExplicitTemplateArgs;
-  
-  llvm::SmallVector<NamedDecl*,8> Fns;
+  const UnresolvedSetImpl *Fns;
   
   // Look into the overloaded expression.
   if (UnresolvedLookupExpr *UL
       = dyn_cast<UnresolvedLookupExpr>(OvlExpr)) {
-    Fns.append(UL->decls_begin(), UL->decls_end());
+    Fns = &UL->getDecls();
     if (UL->hasExplicitTemplateArgs()) {
       HasExplicitTemplateArgs = true;
       UL->copyTemplateArgumentsInto(ExplicitTemplateArgs);
     }
   } else if (UnresolvedMemberExpr *ME
              = dyn_cast<UnresolvedMemberExpr>(OvlExpr)) {
-    Fns.append(ME->decls_begin(), ME->decls_end());
+    Fns = &ME->getDecls();
     if (ME->hasExplicitTemplateArgs()) {
       HasExplicitTemplateArgs = true;
       ME->copyTemplateArgumentsInto(ExplicitTemplateArgs);
     }
-  }
+  } else return 0;
   
   // If we didn't actually find any template-ids, we're done.
-  if (Fns.empty() || !HasExplicitTemplateArgs)
+  if (Fns->empty() || !HasExplicitTemplateArgs)
     return 0;
   
   // Look through all of the overloaded functions, searching for one
   // whose type matches exactly.
   FunctionDecl *Matched = 0;
-  for (llvm::SmallVectorImpl<NamedDecl*>::iterator I = Fns.begin(),
-       E = Fns.end(); I != E; ++I) {
+  for (UnresolvedSetIterator I = Fns->begin(), E = Fns->end(); I != E; ++I) {
     // C++0x [temp.arg.explicit]p3:
     //   [...] In contexts where deduction is done and fails, or in contexts
     //   where deduction is not done, if a template argument list is