[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