[cfe-commits] r39184 - in /cfe/cfe/trunk: AST/Sema.h AST/SemaDecl.cpp Parse/ParseDecl.cpp Parse/Parser.cpp Sema/Sema.h Sema/SemaDecl.cpp include/clang/Parse/Action.h

sabre at cs.uiuc.edu sabre at cs.uiuc.edu
Wed Jul 11 09:40:45 PDT 2007


Author: sabre
Date: Wed Jul 11 11:40:44 2007
New Revision: 39184

URL: http://llvm.org/viewvc/llvm-project?rev=39184&view=rev
Log:
add an action method for declspecs without declarators, like "struct foo;".

Modified:
    cfe/cfe/trunk/AST/Sema.h
    cfe/cfe/trunk/AST/SemaDecl.cpp
    cfe/cfe/trunk/Parse/ParseDecl.cpp
    cfe/cfe/trunk/Parse/Parser.cpp
    cfe/cfe/trunk/Sema/Sema.h
    cfe/cfe/trunk/Sema/SemaDecl.cpp
    cfe/cfe/trunk/include/clang/Parse/Action.h

Modified: cfe/cfe/trunk/AST/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/Sema.h?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/Sema.h (original)
+++ cfe/cfe/trunk/AST/Sema.h Wed Jul 11 11:40:44 2007
@@ -62,6 +62,10 @@
   
   Decl *ParseTypedefDecl(Scope *S, Declarator &D, Decl *PrevDecl);
   
+  /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
+  /// no declarator (e.g. "struct foo;") is parsed.
+  virtual DeclTy *ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS);  
+  
   
   //===--------------------------------------------------------------------===//
   // Statement Parsing Callbacks: SemaStmt.cpp.

Modified: cfe/cfe/trunk/AST/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/SemaDecl.cpp?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/SemaDecl.cpp (original)
+++ cfe/cfe/trunk/AST/SemaDecl.cpp Wed Jul 11 11:40:44 2007
@@ -42,6 +42,20 @@
   }
 }
 
+/// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
+/// no declarator (e.g. "struct foo;") is parsed.
+Sema::DeclTy *Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) {
+  // TODO: emit error on 'int;' or 'const enum foo;'.
+  // TODO: emit error on 'typedef int;'
+  // if (!DS.isMissingDeclaratorOk()) Diag(...);
+  
+  // TODO: Register 'struct foo;' with the type system as an opaque struct.
+  
+  // TODO: Check that we don't already have 'union foo;' or something else
+  // that conflicts.
+  return 0;
+}
+
 Action::DeclTy *
 Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
                       DeclTy *LastInGroup) {
@@ -82,7 +96,8 @@
   return New;
 }
 
-Action::DeclTy *
+
+Sema::DeclTy *
 Sema::ParseFunctionDefinition(Scope *S, Declarator &D, StmtTy *Body) {
   FunctionDecl *FD = (FunctionDecl *)ParseDeclarator(S, D, 0, 0);
   

Modified: cfe/cfe/trunk/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/ParseDecl.cpp?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/Parse/ParseDecl.cpp (original)
+++ cfe/cfe/trunk/Parse/ParseDecl.cpp Wed Jul 11 11:40:44 2007
@@ -79,18 +79,8 @@
   // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };"
   // declaration-specifiers init-declarator-list[opt] ';'
   if (Tok.getKind() == tok::semi) {
-    // TODO: emit error on 'int;' or 'const enum foo;'.
-    // TODO: emit error on 'typedef int;'
-    // if (!DS.isMissingDeclaratorOk()) Diag(...);
-    
-    // TODO: Register 'struct foo;' with the type system as an opaque struct.
-    // TODO: Check that we don't already have 'union foo;' or something else
-    // that conflicts.
-    
     ConsumeToken();
-    
-    // TODO: Return type definition.
-    return 0;
+    return Actions.ParsedFreeStandingDeclSpec(CurScope, DS);
   }
   
   Declarator DeclaratorInfo(DS, (Declarator::TheContext)Context);

Modified: cfe/cfe/trunk/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/Parser.cpp?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/Parse/Parser.cpp (original)
+++ cfe/cfe/trunk/Parse/Parser.cpp Wed Jul 11 11:40:44 2007
@@ -347,13 +347,8 @@
   // C99 6.7.2.3p6: Handle "struct-or-union identifier;", "enum { X };"
   // declaration-specifiers init-declarator-list[opt] ';'
   if (Tok.getKind() == tok::semi) {
-    // TODO: emit error on 'int;' or 'const enum foo;'.
-    // TODO: emit error on 'typedef int;'
-    // if (!DS.isMissingDeclaratorOk()) Diag(...);
-    
     ConsumeToken();
-    // TODO: Pass to actions.
-    return 0;
+    return Actions.ParsedFreeStandingDeclSpec(CurScope, DS);
   }
   
   // Parse the first declarator.

Modified: cfe/cfe/trunk/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/Sema.h?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/Sema.h (original)
+++ cfe/cfe/trunk/Sema/Sema.h Wed Jul 11 11:40:44 2007
@@ -62,6 +62,10 @@
   
   Decl *ParseTypedefDecl(Scope *S, Declarator &D, Decl *PrevDecl);
   
+  /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
+  /// no declarator (e.g. "struct foo;") is parsed.
+  virtual DeclTy *ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS);  
+  
   
   //===--------------------------------------------------------------------===//
   // Statement Parsing Callbacks: SemaStmt.cpp.

Modified: cfe/cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/SemaDecl.cpp?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/cfe/trunk/Sema/SemaDecl.cpp Wed Jul 11 11:40:44 2007
@@ -42,6 +42,20 @@
   }
 }
 
+/// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
+/// no declarator (e.g. "struct foo;") is parsed.
+Sema::DeclTy *Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) {
+  // TODO: emit error on 'int;' or 'const enum foo;'.
+  // TODO: emit error on 'typedef int;'
+  // if (!DS.isMissingDeclaratorOk()) Diag(...);
+  
+  // TODO: Register 'struct foo;' with the type system as an opaque struct.
+  
+  // TODO: Check that we don't already have 'union foo;' or something else
+  // that conflicts.
+  return 0;
+}
+
 Action::DeclTy *
 Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
                       DeclTy *LastInGroup) {
@@ -82,7 +96,8 @@
   return New;
 }
 
-Action::DeclTy *
+
+Sema::DeclTy *
 Sema::ParseFunctionDefinition(Scope *S, Declarator &D, StmtTy *Body) {
   FunctionDecl *FD = (FunctionDecl *)ParseDeclarator(S, D, 0, 0);
   

Modified: cfe/cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/Parse/Action.h?rev=39184&r1=39183&r2=39184&view=diff

==============================================================================
--- cfe/cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/cfe/trunk/include/clang/Parse/Action.h Wed Jul 11 11:40:44 2007
@@ -20,6 +20,7 @@
 namespace llvm {
 namespace clang {
   // Semantic.
+  class DeclSpec;
   class Declarator;
   // Parse.
   class Scope;
@@ -109,8 +110,11 @@
   /// is popped and deleted.
   virtual void PopScope(SourceLocation Loc, Scope *S) {}
   
-  
-  
+  /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
+  /// no declarator (e.g. "struct foo;") is parsed.
+  virtual DeclTy *ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) {
+    return 0;
+  }
   
   virtual DeclTy *ParsedObjcClassDeclaration(Scope *S,
                                              IdentifierInfo **IdentList,





More information about the cfe-commits mailing list