diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-10 23:41:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-10 23:41:04 +0000 |
commit | d8c7ba278e2ccd9113fedbf39c9969ec0bd56db9 (patch) | |
tree | e52e7ac1f1b7bef0092ebc236ccab78e2fa5413b /clang/lib/Sema/SemaStmt.cpp | |
parent | 35b583614780a316d6308c440f9d694ab9b6f7bd (diff) | |
download | bcm5719-llvm-d8c7ba278e2ccd9113fedbf39c9969ec0bd56db9.tar.gz bcm5719-llvm-d8c7ba278e2ccd9113fedbf39c9969ec0bd56db9.zip |
add plumbing to report diagnostics back through sema for malformed asmstrings.
llvm-svn: 66598
Diffstat (limited to 'clang/lib/Sema/SemaStmt.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index fcc501c45d1..55f556444dc 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -958,10 +958,24 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, exprs.release(); asmString.release(); clobbers.release(); - return Owned(new (Context) AsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, - NumInputs, Names, Constraints, Exprs, - AsmString, NumClobbers, - Clobbers, RParenLoc)); + AsmStmt *NS = + new (Context) AsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, NumInputs, + Names, Constraints, Exprs, AsmString, NumClobbers, + Clobbers, RParenLoc); + // Validate the asm string, ensuring it makes sense given the operands we + // have. + llvm::SmallVector<AsmStmt::AsmStringPiece, 8> Pieces; + unsigned DiagOffs; + if (unsigned DiagID = NS->AnalyzeAsmString(Pieces, Context, DiagOffs)) { + // FIXME: get offsets in strings working. + // StringLiteralParser::getOffsetOfStringByte + Diag(AsmString->getLocStart(), DiagID) << AsmString->getSourceRange(); + DeleteStmt(NS); + return StmtError(); + } + + + return Owned(NS); } Action::OwningStmtResult |