summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaStmt.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-10 23:41:04 +0000
committerChris Lattner <sabre@nondot.org>2009-03-10 23:41:04 +0000
commitd8c7ba278e2ccd9113fedbf39c9969ec0bd56db9 (patch)
treee52e7ac1f1b7bef0092ebc236ccab78e2fa5413b /clang/lib/Sema/SemaStmt.cpp
parent35b583614780a316d6308c440f9d694ab9b6f7bd (diff)
downloadbcm5719-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.cpp22
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
OpenPOWER on IntegriCloud