diff options
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 12 |
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 |

