]> granicus.if.org Git - clang/commitdiff
Handle overload resolution when calling an overloaded function set
authorDouglas Gregor <dgregor@apple.com>
Tue, 9 Nov 2010 16:13:15 +0000 (16:13 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 9 Nov 2010 16:13:15 +0000 (16:13 +0000)
with, e.g., (&f)(a, b, c). Fixes PR8013.

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

lib/Sema/SemaCodeComplete.cpp
lib/Sema/SemaExpr.cpp
test/CodeCompletion/call.cpp
test/SemaCXX/overload-call.cpp

index 73c19a755be951e908f313249d9c8987f85ae01c..27943d5d3ffc4a34edd249b287a0739e5023c493 100644 (file)
@@ -3306,6 +3306,10 @@ void Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn,
   llvm::SmallVector<ResultCandidate, 8> Results;
 
   Expr *NakedFn = Fn->IgnoreParenCasts();
+  if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn))
+    if (UnOp->getOpcode() == UO_AddrOf)
+      NakedFn = UnOp->getSubExpr()->IgnoreParens();
+
   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
     AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet,
                                 /*PartialOverloading=*/ true);
index 0d0f48cd743e60f07485347489bf760a01fe6c29..f404c20b413b2bd9233a39fac09526876410db54 100644 (file)
@@ -3781,17 +3781,15 @@ Sema::ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc,
   // lookup and whether there were any explicitly-specified template arguments.
 
   Expr *NakedFn = Fn->IgnoreParens();
-  if (isa<UnresolvedLookupExpr>(NakedFn)) {
-    UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(NakedFn);
-    return BuildOverloadedCallExpr(S, Fn, ULE, LParenLoc, Args, NumArgs,
-                                   RParenLoc);
-  }
-
   NamedDecl *NDecl = 0;
   if (UnaryOperator *UnOp = dyn_cast<UnaryOperator>(NakedFn))
     if (UnOp->getOpcode() == UO_AddrOf)
       NakedFn = UnOp->getSubExpr()->IgnoreParens();
   
+  if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
+    return BuildOverloadedCallExpr(S, Fn, ULE, LParenLoc, Args, NumArgs,
+                                   RParenLoc);
+
   if (isa<DeclRefExpr>(NakedFn))
     NDecl = cast<DeclRefExpr>(NakedFn)->getDecl();
 
index f06470f4cbe738afa84058a93f8e2183bb838413..65b1cf1f2b1b09fbf7dda39705fae20c2183d871 100644 (file)
@@ -17,12 +17,14 @@ void f();
 
 void test() {
   f(Y(), 0, 0);
-  // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:19:9 %s -o - | FileCheck -check-prefix=CC1 %s
+  (&f)(Y(), 0, 0);
+  // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:19:9 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
   // CHECK-CC1: COMPLETION: Pattern : dynamic_cast<<#type#>>(<#expression#>)
   // CHECK-CC1: f(N::Y y, <#int ZZ#>)
   // CHECK-CC1-NEXT: f(int i, <#int j#>, int k)
   // CHECK-CC1-NEXT: f(float x, <#float y#>)
-  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:19:13 %s -o - | FileCheck -check-prefix=CC2 %s
+  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:19:13 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
   // CHECK-CC2-NOT: f(N::Y y, int ZZ)
   // CHECK-CC2: f(int i, int j, <#int k#>)
 }
+  // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:20:16 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
index 81a88a3a9ac341531d539fca07a7770939458d11..7aeb9522f1f8083eb9605bea395592651df1478a 100644 (file)
@@ -503,3 +503,11 @@ namespace rdar8499524 {
     g(W());
   }
 }
+
+namespace PR8013 {
+  void f(int,int);
+  void f(int,int,int);
+  void g() {
+    (&f)(1,2,3);
+  }
+}