зеркало из https://github.com/microsoft/clang.git
Revert the fix for PR8013.
That bug concerned the well-formedness of code such as (&ovl)(a, b, c). GCC rejects the code, while EDG accepts it. On further study of the standard, I see no support for EDG's position: in particular, C++ [over.over] does not list this as a context where we can take the address of an overloaded function, C++ [over.call.func] does not reference the address-of operator at any point, and C++ [expr.call] claims that the function argument in a call is either a function lvalue or a pointer-to-function; (&ovl) is neither. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
edfb7ecea0
Коммит
ef9b149790
|
@ -3306,10 +3306,6 @@ 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);
|
||||
|
|
|
@ -3781,15 +3781,17 @@ 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();
|
||||
|
||||
|
|
|
@ -17,14 +17,12 @@ void f();
|
|||
|
||||
void test() {
|
||||
f(Y(), 0, 0);
|
||||
(&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
|
||||
// RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:19:9 %s -o - | FileCheck -check-prefix=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=CHECK-CC2 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:19:13 %s -o - | FileCheck -check-prefix=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
|
||||
|
|
|
@ -503,11 +503,3 @@ namespace rdar8499524 {
|
|||
g(W());
|
||||
}
|
||||
}
|
||||
|
||||
namespace PR8013 {
|
||||
void f(int,int);
|
||||
void f(int,int,int);
|
||||
void g() {
|
||||
(&f)(1,2,3);
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче