[cfe-commits] r48330 - in /cfe/trunk: AST/StmtSerialization.cpp Parse/ParseDecl.cpp Parse/ParseObjc.cpp Parse/ParseStmt.cpp Sema/Sema.h Sema/SemaStmt.cpp include/clang/AST/Stmt.h include/clang/Parse/Action.h include/clang/Parse/DeclSpec.h
Chris Lattner
sabre at nondot.org
Wed Mar 12 23:29:04 PDT 2008
Author: lattner
Date: Thu Mar 13 01:29:04 2008
New Revision: 48330
URL: http://llvm.org/viewvc/llvm-project?rev=48330&view=rev
Log:
improve DeclStmt to be able to store SourceRange info correctly.
Set the start of DeclStmt range. Right now the end is meaningless
though.
Modified:
cfe/trunk/AST/StmtSerialization.cpp
cfe/trunk/Parse/ParseDecl.cpp
cfe/trunk/Parse/ParseObjc.cpp
cfe/trunk/Parse/ParseStmt.cpp
cfe/trunk/Sema/Sema.h
cfe/trunk/Sema/SemaStmt.cpp
cfe/trunk/include/clang/AST/Stmt.h
cfe/trunk/include/clang/Parse/Action.h
cfe/trunk/include/clang/Parse/DeclSpec.h
Modified: cfe/trunk/AST/StmtSerialization.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/AST/StmtSerialization.cpp?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/AST/StmtSerialization.cpp (original)
+++ cfe/trunk/AST/StmtSerialization.cpp Thu Mar 13 01:29:04 2008
@@ -456,6 +456,8 @@
void DeclStmt::EmitImpl(Serializer& S) const {
// FIXME: special handling for struct decls.
S.EmitOwnedPtr(getDecl());
+ S.Emit(StartLoc);
+ S.Emit(EndLoc);
}
void DeclRefExpr::EmitImpl(Serializer& S) const {
@@ -505,7 +507,9 @@
DeclStmt* DeclStmt::CreateImpl(Deserializer& D) {
ScopedDecl* decl = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
- return new DeclStmt(decl);
+ SourceLocation StartLoc = SourceLocation::ReadVal(D);
+ SourceLocation EndLoc = SourceLocation::ReadVal(D);
+ return new DeclStmt(decl, StartLoc, EndLoc);
}
void DefaultStmt::EmitImpl(Serializer& S) const {
Modified: cfe/trunk/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseDecl.cpp?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/Parse/ParseDecl.cpp Thu Mar 13 01:29:04 2008
@@ -388,7 +388,7 @@
/// [C99] 'inline'
///
void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) {
- DS.Range.setBegin(Tok.getLocation());
+ DS.SetRangeStart(Tok.getLocation());
while (1) {
int isInvalid = false;
const char *PrevSpec = 0;
@@ -409,7 +409,7 @@
if (isInvalid)
break;
// FIXME: restrict this to "id" and ObjC classnames.
- DS.Range.setEnd(Tok.getLocation());
+ DS.SetRangeEnd(Tok.getLocation());
ConsumeToken(); // The identifier
if (Tok.is(tok::less)) {
SourceLocation endProtoLoc;
@@ -555,7 +555,7 @@
else // extwarn.
Diag(Tok, diag::ext_duplicate_declspec, PrevSpec);
}
- DS.Range.setEnd(Tok.getLocation());
+ DS.SetRangeEnd(Tok.getLocation());
ConsumeToken();
}
}
Modified: cfe/trunk/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseObjc.cpp?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/Parse/ParseObjc.cpp Thu Mar 13 01:29:04 2008
@@ -1186,9 +1186,11 @@
// FIXME: Is BlockContext right?
Declarator DeclaratorInfo(DS, Declarator::BlockContext);
ParseDeclarator(DeclaratorInfo);
- DeclTy * aBlockVarDecl = Actions.ActOnDeclarator(CurScope,
- DeclaratorInfo, 0);
- StmtResult stmtResult = Actions.ActOnDeclStmt(aBlockVarDecl);
+ DeclTy *aBlockVarDecl = Actions.ActOnDeclarator(CurScope,
+ DeclaratorInfo, 0);
+ StmtResult stmtResult =
+ Actions.ActOnDeclStmt(aBlockVarDecl, DS.getSourceRange().getBegin(),
+ DeclaratorInfo.getSourceRange().getEnd());
FirstPart = stmtResult.isInvalid ? 0 : stmtResult.Val;
} else
ConsumeToken(); // consume '...'
Modified: cfe/trunk/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseStmt.cpp?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/Parse/ParseStmt.cpp Thu Mar 13 01:29:04 2008
@@ -93,7 +93,10 @@
default:
if (!OnlyStatement && isDeclarationSpecifier()) {
- return Actions.ActOnDeclStmt(ParseDeclaration(Declarator::BlockContext));
+ SourceLocation DeclStart = Tok.getLocation();
+ DeclTy *Res = ParseDeclaration(Declarator::BlockContext);
+ // FIXME: Pass in the right location for the end of the declstmt.
+ return Actions.ActOnDeclStmt(Res, DeclStart, SourceLocation());
} else if (Tok.is(tok::r_brace)) {
Diag(Tok, diag::err_expected_statement);
return true;
@@ -255,7 +258,9 @@
ParseDeclarator(DeclaratorInfo);
DeclTy *Decl = ParseInitDeclaratorListAfterFirstDeclarator(DeclaratorInfo);
- return Decl ? Actions.ActOnDeclStmt(Decl) : 0;
+ if (!Decl) return 0;
+ return Actions.ActOnDeclStmt(Decl, DS.getSourceRange().getBegin(),
+ DeclaratorInfo.getSourceRange().getEnd());
}
// Otherwise, this is an expression. Seed it with II and parse it.
@@ -430,7 +435,10 @@
if (isDeclarationSpecifier()) {
// FIXME: Save the __extension__ on the decl as a node somehow.
// FIXME: disable extwarns.
- R = Actions.ActOnDeclStmt(ParseDeclaration(Declarator::BlockContext));
+ SourceLocation DeclStart = Tok.getLocation();
+ DeclTy *Res = ParseDeclaration(Declarator::BlockContext);
+ // FIXME: Pass in the right location for the end of the declstmt.
+ R = Actions.ActOnDeclStmt(Res, DeclStart, SourceLocation());
} else {
// Otherwise this was a unary __extension__ marker. Parse the
// subexpression and add the __extension__ unary op.
@@ -743,8 +751,12 @@
// Parse declaration, which eats the ';'.
if (!getLang().C99) // Use of C99-style for loops in C90 mode?
Diag(Tok, diag::ext_c99_variable_decl_in_for_loop);
+
+ SourceLocation DeclStart = Tok.getLocation();
DeclTy *aBlockVarDecl = ParseDeclaration(Declarator::ForContext);
- StmtResult stmtResult = Actions.ActOnDeclStmt(aBlockVarDecl);
+ // FIXME: Pass in the right location for the end of the declstmt.
+ StmtResult stmtResult = Actions.ActOnDeclStmt(aBlockVarDecl, DeclStart,
+ SourceLocation());
FirstPart = stmtResult.isInvalid ? 0 : stmtResult.Val;
if ((ForEach = isTokIdentifier_in())) {
ConsumeToken(); // consume 'in'
Modified: cfe/trunk/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/Sema.h?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/Sema/Sema.h (original)
+++ cfe/trunk/Sema/Sema.h Thu Mar 13 01:29:04 2008
@@ -339,7 +339,8 @@
virtual StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R,
StmtTy **Elts, unsigned NumElts,
bool isStmtExpr);
- virtual StmtResult ActOnDeclStmt(DeclTy *Decl);
+ virtual StmtResult ActOnDeclStmt(DeclTy *Decl, SourceLocation StartLoc,
+ SourceLocation EndLoc);
virtual StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprTy *LHSVal,
SourceLocation DotDotDotLoc, ExprTy *RHSVal,
SourceLocation ColonLoc, StmtTy *SubStmt);
Modified: cfe/trunk/Sema/SemaStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaStmt.cpp?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/Sema/SemaStmt.cpp (original)
+++ cfe/trunk/Sema/SemaStmt.cpp Thu Mar 13 01:29:04 2008
@@ -33,13 +33,13 @@
return new NullStmt(SemiLoc);
}
-Sema::StmtResult Sema::ActOnDeclStmt(DeclTy *decl) {
- if (decl) {
- ScopedDecl *SD = dyn_cast<ScopedDecl>(static_cast<Decl *>(decl));
- assert(SD && "Sema::ActOnDeclStmt(): expected ScopedDecl");
- return new DeclStmt(SD);
- } else
- return true; // error
+Sema::StmtResult Sema::ActOnDeclStmt(DeclTy *decl, SourceLocation StartLoc,
+ SourceLocation EndLoc) {
+ if (decl == 0)
+ return true;
+
+ ScopedDecl *SD = cast<ScopedDecl>(static_cast<Decl *>(decl));
+ return new DeclStmt(SD, StartLoc, EndLoc);
}
Action::StmtResult
Modified: cfe/trunk/include/clang/AST/Stmt.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Stmt.h (original)
+++ cfe/trunk/include/clang/AST/Stmt.h Thu Mar 13 01:29:04 2008
@@ -132,13 +132,19 @@
///
class DeclStmt : public Stmt {
ScopedDecl *TheDecl;
+ SourceLocation StartLoc, EndLoc;
public:
- DeclStmt(ScopedDecl *D) : Stmt(DeclStmtClass), TheDecl(D) {}
+ DeclStmt(ScopedDecl *D, SourceLocation startLoc, SourceLocation endLoc)
+ : Stmt(DeclStmtClass), TheDecl(D), StartLoc(startLoc), EndLoc(endLoc) {}
const ScopedDecl *getDecl() const { return TheDecl; }
ScopedDecl *getDecl() { return TheDecl; }
- virtual SourceRange getSourceRange() const { return SourceRange(); }
+ SourceLocation getStartLoc() const { return StartLoc; }
+ SourceLocation getEndLoc() const { return EndLoc; }
+ virtual SourceRange getSourceRange() const {
+ return SourceRange(StartLoc, EndLoc);
+ }
static bool classof(const Stmt *T) {
return T->getStmtClass() == DeclStmtClass;
Modified: cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Thu Mar 13 01:29:04 2008
@@ -220,7 +220,8 @@
bool isStmtExpr) {
return 0;
}
- virtual StmtResult ActOnDeclStmt(DeclTy *Decl) {
+ virtual StmtResult ActOnDeclStmt(DeclTy *Decl, SourceLocation StartLoc,
+ SourceLocation EndLoc) {
return 0;
}
Modified: cfe/trunk/include/clang/Parse/DeclSpec.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/DeclSpec.h?rev=48330&r1=48329&r2=48330&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/DeclSpec.h (original)
+++ cfe/trunk/include/clang/Parse/DeclSpec.h Thu Mar 13 01:29:04 2008
@@ -28,9 +28,6 @@
/// type-qualifiers, and function-specifiers.
class DeclSpec {
public:
- SourceRange Range;
- const SourceRange &getSourceRange() const { return Range; }
-
// storage-class-specifier
enum SCS {
SCS_unspecified,
@@ -130,6 +127,8 @@
// SourceLocation info. These are null if the item wasn't specified or if
// the setting was synthesized.
+ SourceRange Range;
+
SourceLocation StorageClassSpecLoc, SCS_threadLoc;
SourceLocation TSWLoc, TSCLoc, TSSLoc, TSTLoc;
SourceLocation TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc;
@@ -181,6 +180,7 @@
TST getTypeSpecType() const { return (TST)TypeSpecType; }
void *getTypeRep() const { return TypeRep; }
+ const SourceRange &getSourceRange() const { return Range; }
SourceLocation getTypeSpecWidthLoc() const { return TSWLoc; }
SourceLocation getTypeSpecComplexLoc() const { return TSCLoc; }
SourceLocation getTypeSpecSignLoc() const { return TSSLoc; }
@@ -222,6 +222,9 @@
///
unsigned getParsedSpecifiers() const;
+ void SetRangeStart(SourceLocation Loc) { Range.setBegin(Loc); }
+ void SetRangeEnd(SourceLocation Loc) { Range.setEnd(Loc); }
+
/// These methods set the specified attribute of the DeclSpec, but return true
/// and ignore the request if invalid (e.g. "extern" then "auto" is
/// specified). The name of the previous specifier is returned in prevspec.
More information about the cfe-commits
mailing list