Create CXXMemberCallExpr for pointer-to-member calls.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83268 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-10-03 17:40:22 +00:00
Родитель 26bc220377
Коммит 83ccfc3cf0
1 изменённых файлов: 22 добавлений и 0 удалений

Просмотреть файл

@ -2902,6 +2902,28 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc,
return Owned(BuildCallToMemberFunction(S, Fn, LParenLoc, Args, NumArgs,
CommaLocs, RParenLoc));
}
// Determine whether this is a call to a pointer-to-member function.
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Fn->IgnoreParens())) {
if (BO->getOpcode() == BinaryOperator::PtrMemD ||
BO->getOpcode() == BinaryOperator::PtrMemI) {
const FunctionProtoType *FPT = cast<FunctionProtoType>(BO->getType());
QualType ReturnTy = FPT->getResultType();
CXXMemberCallExpr *CE =
new (Context) CXXMemberCallExpr(Context, BO, Args, NumArgs,
ReturnTy.getNonReferenceType(),
RParenLoc);
ExprOwningPtr<CXXMemberCallExpr> TheCall(this, CE);
if (ConvertArgumentsForCall(&*TheCall, BO, 0, FPT, Args, NumArgs,
RParenLoc))
return ExprError();
return Owned(MaybeBindToTemporary(TheCall.release()).release());
}
}
}
// If we're directly calling a function, get the appropriate declaration.