diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-09-04 22:16:48 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-09-04 22:16:48 +0000 |
commit | 93dbeae0f7345b34080082a17fd0568aa2afe292 (patch) | |
tree | 3757ccc988400b9c48aa0b7e668a11aac9c5835f /clang/lib | |
parent | d62cdd2c14c481e6d3e7fdebc17baba2ba447b24 (diff) | |
download | bcm5719-llvm-93dbeae0f7345b34080082a17fd0568aa2afe292.tar.gz bcm5719-llvm-93dbeae0f7345b34080082a17fd0568aa2afe292.zip |
Don't allow inline asm statements to reference parameters in naked functions
Differential Revision: http://reviews.llvm.org/D5183
llvm-svn: 217200
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaStmtAsm.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index 47a7672ae19..989999f18d9 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -405,6 +405,19 @@ ExprResult Sema::LookupInlineAsmIdentifier(CXXScopeSpec &SS, Result = CheckPlaceholderExpr(Result.get()); if (!Result.isUsable()) return Result; + // Referring to parameters is not allowed in naked functions. + if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Result.get())) { + if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(DRE->getDecl())) { + if (FunctionDecl *Func = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { + if (Func->hasAttr<NakedAttr>()) { + Diag(Id.getLocStart(), diag::err_asm_naked_parm_ref); + Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute); + return ExprError(); + } + } + } + } + QualType T = Result.get()->getType(); // For now, reject dependent types. |