]> granicus.if.org Git - clang/commitdiff
pass designators into sema. This completes parser-level designator
authorChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 23:35:51 +0000 (23:35 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 23:35:51 +0000 (23:35 +0000)
support as far as I know.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58217 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/PrintParserCallbacks.cpp
include/clang/Parse/Action.h
include/clang/Parse/Designator.h
lib/Parse/ParseInit.cpp
lib/Sema/Sema.h
lib/Sema/SemaExpr.cpp

index b616268376f900780761b69f8c095f6302c6be98..94cc0e2237434e2c06422d6f77839b5a64d8e1f6 100644 (file)
@@ -485,6 +485,7 @@ namespace {
     }
     virtual ExprResult ActOnInitList(SourceLocation LParenLoc,
                                      ExprTy **InitList, unsigned NumInit,
+                                     InitListDesignations &Designators,
                                      SourceLocation RParenLoc) {
       llvm::cout << __FUNCTION__ << "\n";
       return 0;
index 7e71c9a14b25ab8550863e886ac198a0859a18e0..63f5be704a716630653a87623834441825f25a4c 100644 (file)
@@ -459,6 +459,7 @@ public:
   }
   virtual ExprResult ActOnInitList(SourceLocation LParenLoc,
                                    ExprTy **InitList, unsigned NumInit,
+                                   InitListDesignations &Designators,
                                    SourceLocation RParenLoc) {
     return 0;
   }
index 5abf70ddee04d590fcd8b1a01524c869de9f15c2..6a5cff63e9047e2c3a8a8aaf6ae7b20c50eccc99 100644 (file)
@@ -208,6 +208,19 @@ public:
     return Designations.back();
   }
   
+  /// getDesignationForInitializer - If there is a designator for the specified
+  /// initializer, return it, otherwise return null.
+  const Designation *getDesignationForInitializer(unsigned Idx) const {
+    // The common case is no designators.
+    if (!hasAnyDesignators()) return 0;
+    
+    // FIXME: This should do a binary search, not a linear one.
+    for (unsigned i = 0, e = Designations.size(); i != e; ++i)
+      if (Designations[i].InitIndex == Idx)
+        return &Designations[i];
+    return 0;
+  }
+  
 };
 
 } // end namespace clang
index 655d8e75c729be6e4d148745b7cba7d17eca390c..82a33c21dadae560130ed45d3b4559f503a9e788 100644 (file)
@@ -236,14 +236,6 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
 Parser::ExprResult Parser::ParseBraceInitializer() {
   SourceLocation LBraceLoc = ConsumeBrace();
   
-  // We support empty initializers, but tell the user that they aren't using
-  // C99-clean code.
-  if (Tok.is(tok::r_brace)) {
-    Diag(LBraceLoc, diag::ext_gnu_empty_initializer);
-    // Match the '}'.
-    return Actions.ActOnInitList(LBraceLoc, 0, 0, ConsumeBrace());
-  }
-  
   /// InitExprs - This is the actual list of expressions contained in the
   /// initializer.
   llvm::SmallVector<ExprTy*, 8> InitExprs;
@@ -252,6 +244,15 @@ Parser::ExprResult Parser::ParseBraceInitializer() {
   /// was specified for it, if any.
   InitListDesignations InitExprDesignations(Actions);
 
+  // We support empty initializers, but tell the user that they aren't using
+  // C99-clean code.
+  if (Tok.is(tok::r_brace)) {
+    Diag(LBraceLoc, diag::ext_gnu_empty_initializer);
+    // Match the '}'.
+    return Actions.ActOnInitList(LBraceLoc, 0, 0, InitExprDesignations,
+                                 ConsumeBrace());
+  }
+  
   bool InitExprsOk = true;
   
   while (1) {
@@ -293,8 +294,8 @@ Parser::ExprResult Parser::ParseBraceInitializer() {
     if (Tok.is(tok::r_brace)) break;
   }
   if (InitExprsOk && Tok.is(tok::r_brace))
-    return Actions.ActOnInitList(LBraceLoc, &InitExprs[0], InitExprs.size(), 
-                                 ConsumeBrace());
+    return Actions.ActOnInitList(LBraceLoc, &InitExprs[0], InitExprs.size(),
+                                 InitExprDesignations, ConsumeBrace());
   
   // On error, delete any parsed subexpressions.
   for (unsigned i = 0, e = InitExprs.size(); i != e; ++i)
index ef34a105340e640f7fae3a15ca09b57a50f2acf0..c68776a80fb3a7f28432282f757ff275a96bddd2 100644 (file)
@@ -614,6 +614,7 @@ public:
   
   virtual ExprResult ActOnInitList(SourceLocation LParenLoc, 
                                    ExprTy **InitList, unsigned NumInit,
+                                   InitListDesignations &Designators,
                                    SourceLocation RParenLoc);
                                    
   virtual ExprResult ActOnBinOp(SourceLocation TokLoc, tok::TokenKind Kind,
index 13b3959d8c3576a0f0bb5e45b64983d85d0e47bc..fee94568b78c5f497663b87d8e4c045f55d2798f 100644 (file)
@@ -1247,11 +1247,13 @@ ActOnCompoundLiteral(SourceLocation LParenLoc, TypeTy *Ty,
     if (CheckForConstantInitializer(literalExpr, literalType))
       return true;
   }
-  return new CompoundLiteralExpr(LParenLoc, literalType, literalExpr, isFileScope);
+  return new CompoundLiteralExpr(LParenLoc, literalType, literalExpr,
+                                 isFileScope);
 }
 
 Action::ExprResult Sema::
 ActOnInitList(SourceLocation LBraceLoc, ExprTy **initlist, unsigned NumInit,
+              InitListDesignations &Designators,
               SourceLocation RBraceLoc) {
   Expr **InitList = reinterpret_cast<Expr**>(initlist);