summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index c0b61bf8d7c..48f338e475d 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2032,13 +2032,21 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc,
// Make the call expr early, before semantic checks. This guarantees cleanup
// of arguments and function on error.
- // FIXME: Except that llvm::OwningPtr uses delete, when it really must be
- // Destroy(), or nothing gets cleaned up.
ExprOwningPtr<CallExpr> TheCall(this, new (Context) CallExpr(Context, Fn,
Args, NumArgs,
Context.BoolTy,
RParenLoc));
+ // Check for a call to a (FIXME: deleted) or unavailable function.
+ if (FDecl && FDecl->getAttr<UnavailableAttr>()) {
+ Diag(Fn->getSourceRange().getBegin(), diag::err_call_deleted_function)
+ << FDecl->getAttr<UnavailableAttr>() << FDecl->getDeclName()
+ << Fn->getSourceRange();
+ Diag(FDecl->getLocation(), diag::note_deleted_function_here)
+ << FDecl->getAttr<UnavailableAttr>();
+ return ExprError();
+ }
+
const FunctionType *FuncT;
if (!Fn->getType()->isBlockPointerType()) {
// C99 6.5.2.2p1 - "The expression that denotes the called function shall
OpenPOWER on IntegriCloud