diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-09-04 22:16:40 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-09-04 22:16:40 +0000 |
commit | d62cdd2c14c481e6d3e7fdebc17baba2ba447b24 (patch) | |
tree | 74ec17ac315fd371260ec500e99e6ae94fd0328a /clang/lib/Sema | |
parent | d71907dd077ba3385dbb5ebad479eeb7391cef91 (diff) | |
download | bcm5719-llvm-d62cdd2c14c481e6d3e7fdebc17baba2ba447b24.tar.gz bcm5719-llvm-d62cdd2c14c481e6d3e7fdebc17baba2ba447b24.zip |
Don't allow non-ASM statements in naked functions
Naked functions don't have prologues or epilogues, so doing
codegen for anything other than inline assembly would be completely
hit or miss.
Differential Revision: http://reviews.llvm.org/D5183
llvm-svn: 217199
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 9f49e68c072..f5ba0ea9032 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -10376,6 +10376,17 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, !CheckConstexprFunctionBody(FD, Body))) FD->setInvalidDecl(); + if (FD && FD->hasAttr<NakedAttr>()) { + for (const Stmt *S : Body->children()) { + if (!isa<AsmStmt>(S)) { + Diag(S->getLocStart(), diag::err_non_asm_stmt_in_naked_function); + Diag(FD->getAttr<NakedAttr>()->getLocation(), diag::note_attribute); + FD->setInvalidDecl(); + break; + } + } + } + assert(ExprCleanupObjects.empty() && "Leftover temporaries in function"); assert(!ExprNeedsCleanups && "Unaccounted cleanups in function"); assert(MaybeODRUseExprs.empty() && |