aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/Stmt.cpp10
-rw-r--r--lib/Parse/ParseStmt.cpp7
-rw-r--r--lib/Sema/SemaStmt.cpp3
-rw-r--r--lib/Sema/TreeTransform.h4
4 files changed, 14 insertions, 10 deletions
diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp
index ff6374c2d8..763f8bd33a 100644
--- a/lib/AST/Stmt.cpp
+++ b/lib/AST/Stmt.cpp
@@ -583,10 +583,14 @@ AsmStmt::AsmStmt(ASTContext &C, SourceLocation asmloc, bool issimple,
std::copy(clobbers, clobbers + NumClobbers, Clobbers);
}
-MSAsmStmt::MSAsmStmt(ASTContext &C, SourceLocation asmloc, std::string &asmstr,
- SourceLocation endloc)
- : Stmt(MSAsmStmtClass), AsmLoc(asmloc), EndLoc(endloc), AsmStr(asmstr),
+MSAsmStmt::MSAsmStmt(ASTContext &C, SourceLocation asmloc,
+ SmallVectorImpl<Token> &asmtoks,
+ std::string &asmstr, SourceLocation endloc)
+ : Stmt(MSAsmStmtClass), AsmLoc(asmloc), EndLoc(endloc),
+ AsmToks(asmtoks.size()), AsmStr(asmstr),
IsSimple(true), IsVolatile(true) {
+ for (unsigned i = 0, e = asmtoks.size(); i != e; ++i)
+ AsmToks.push_back(asmtoks[i]);
}
ObjCForCollectionStmt::ObjCForCollectionStmt(Stmt *Elem, Expr *Collect,
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index e13ce6b407..69f28ecd6d 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -1816,12 +1816,9 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) {
}
}
- // FIXME: We should be passing the tokens and source locations, rather than
- // (or possibly in addition to the) AsmString. Sema is going to interact with
- // MC to determine Constraints, Clobbers, etc., which would be simplest to
- // do with the tokens.
+ // FIXME: We should be passing source locations for better diagnostics.
std::string AsmString = Asm.c_str();
- return Actions.ActOnMSAsmStmt(AsmLoc, AsmString, EndLoc);
+ return Actions.ActOnMSAsmStmt(AsmLoc, AsmToks, AsmString, EndLoc);
}
/// ParseAsmStatement - Parse a GNU extended asm statement.
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp
index 4612930d45..718a7e6b53 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/lib/Sema/SemaStmt.cpp
@@ -2748,13 +2748,14 @@ StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, bool IsSimple,
}
StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
+ SmallVectorImpl<Token> &AsmToks,
std::string &AsmString,
SourceLocation EndLoc) {
// MS-style inline assembly is not fully supported, so emit a warning.
Diag(AsmLoc, diag::warn_unsupported_msasm);
MSAsmStmt *NS =
- new (Context) MSAsmStmt(Context, AsmLoc, AsmString, EndLoc);
+ new (Context) MSAsmStmt(Context, AsmLoc, AsmToks, AsmString, EndLoc);
return Owned(NS);
}
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 0dd9d9c191..71af263642 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1185,9 +1185,10 @@ public:
/// By default, performs semantic analysis to build the new statement.
/// Subclasses may override this routine to provide different behavior.
StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc,
+ SmallVectorImpl<Token> &AsmToks,
std::string &AsmString,
SourceLocation EndLoc) {
- return getSema().ActOnMSAsmStmt(AsmLoc, AsmString, EndLoc);
+ return getSema().ActOnMSAsmStmt(AsmLoc, AsmToks, AsmString, EndLoc);
}
/// \brief Build a new Objective-C \@try statement.
@@ -5611,6 +5612,7 @@ StmtResult
TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
// No need to transform the asm string literal.
return getDerived().RebuildMSAsmStmt(S->getAsmLoc(),
+ S->getAsmToks(),
*S->getAsmString(),
S->getEndLoc());
}