[cfe-commits] r41606 - in /cfe/trunk: Parse/ParseExpr.cpp include/clang/Parse/Action.h

Chris Lattner sabre at nondot.org
Thu Aug 30 08:51:11 PDT 2007


Author: lattner
Date: Thu Aug 30 10:51:11 2007
New Revision: 41606

URL: http://llvm.org/viewvc/llvm-project?rev=41606&view=rev
Log:
add an action callback for __builtin_offsetof

Modified:
    cfe/trunk/Parse/ParseExpr.cpp
    cfe/trunk/include/clang/Parse/Action.h

Modified: cfe/trunk/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseExpr.cpp?rev=41606&r1=41605&r2=41606&view=diff

==============================================================================
--- cfe/trunk/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/Parse/ParseExpr.cpp Thu Aug 30 10:51:11 2007
@@ -773,40 +773,66 @@
     ParseTypeName();
     break;
     
-  case tok::kw___builtin_offsetof:
-    ParseTypeName();
+  case tok::kw___builtin_offsetof: {
+    TypeTy *Ty = ParseTypeName();
 
     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
       return ExprResult(true);
     
     // We must have at least one identifier here.
-    if (ExpectAndConsume(tok::identifier, diag::err_expected_ident, "",
-                         tok::r_paren))
-      return ExprResult(true);
+    if (Tok.getKind() != tok::identifier) {
+      Diag(Tok, diag::err_expected_ident);
+      SkipUntil(tok::r_paren);
+      return true;
+    }
+    
+    // Keep track of the various subcomponents we see.
+    llvm::SmallVector<Action::OffsetOfComponent, 4> Comps;
+    
+    Comps.push_back(Action::OffsetOfComponent());
+    Comps.back().isBrackets = false;
+    Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
+    Comps.back().LocStart = Comps.back().LocEnd = ConsumeToken();
 
     while (1) {
       if (Tok.getKind() == tok::period) {
         // offsetof-member-designator: offsetof-member-designator '.' identifier
-        ConsumeToken();
+        Comps.push_back(Action::OffsetOfComponent());
+        Comps.back().isBrackets = false;
+        Comps.back().LocStart = ConsumeToken();
+        
+        if (Tok.getKind() != tok::identifier) {
+          Diag(Tok, diag::err_expected_ident);
+          SkipUntil(tok::r_paren);
+          return true;
+        }
+        Comps.back().U.IdentInfo = Tok.getIdentifierInfo();
+        Comps.back().LocEnd = ConsumeToken();
         
-        if (ExpectAndConsume(tok::identifier, diag::err_expected_ident, "",
-                             tok::r_paren))
-          return ExprResult(true);
       } else if (Tok.getKind() == tok::l_square) {
         // offsetof-member-designator: offsetof-member-design '[' expression ']'
-        SourceLocation LSquareLoc = ConsumeBracket();
+        Comps.push_back(Action::OffsetOfComponent());
+        Comps.back().isBrackets = true;
+        Comps.back().LocStart = ConsumeBracket();
         Res = ParseExpression();
         if (Res.isInvalid) {
           SkipUntil(tok::r_paren);
           return Res;
         }
+        Comps.back().U.E = Res.Val;
 
-        MatchRHSPunctuation(tok::r_square, LSquareLoc);
+        Comps.back().LocEnd =
+          MatchRHSPunctuation(tok::r_square, Comps.back().LocStart);
+      } else if (Tok.getKind() == tok::r_paren) {
+        return Actions.ParseBuiltinOffsetOf(StartLoc, Ty, &Comps[0],
+                                            Comps.size(), ConsumeParen());
       } else {
-        break;
+        // Error occurred.
+        return ExprResult(true);
       }
     }
     break;
+  }
   case tok::kw___builtin_choose_expr: {
     ExprResult Cond = ParseAssignmentExpression();
     if (Cond.isInvalid) {

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

==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Thu Aug 30 10:51:11 2007
@@ -375,6 +375,25 @@
                                    SourceLocation RPLoc) { // "({..})"
     return 0;
   }
+  
+  // __builtin_offsetof(type, identifier(.identifier|[expr])*)
+  struct OffsetOfComponent {
+    SourceLocation LocStart, LocEnd;
+    bool isBrackets;  // true if [expr], false if .ident
+    union {
+      IdentifierInfo *IdentInfo;
+      ExprTy *E;
+    } U;
+  };
+  
+  virtual ExprResult ParseBuiltinOffsetOf(SourceLocation BuiltinLoc,
+                                          TypeTy *Arg1,
+                                          OffsetOfComponent *CompPtr,
+                                          unsigned NumComponents,
+                                          SourceLocation RParenLoc) {
+    return 0;
+  }
+  
   // __builtin_types_compatible_p(type1, type2)
   virtual ExprResult ParseTypesCompatibleExpr(SourceLocation BuiltinLoc, 
                                               TypeTy *arg1, TypeTy *arg2,





More information about the cfe-commits mailing list