]> granicus.if.org Git - clang/commitdiff
Remember whether an initlist had a designator in the AST.
authorChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 23:43:26 +0000 (23:43 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 26 Oct 2008 23:43:26 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58218 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteObjC.cpp
clang.xcodeproj/project.pbxproj
include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaInit.cpp

index 3e8216e6679f1e7d018dfad7ece73e71e9b2e8b1..b62b5fa2372cde8c9974d8e1cc174f61a010122c 100644 (file)
@@ -2123,8 +2123,9 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {
         // (struct objc_super) { <exprs from above> }
         InitListExpr *ILE = new InitListExpr(SourceLocation(), 
                                              &InitExprs[0], InitExprs.size(), 
-                                             SourceLocation());
-        SuperRep = new CompoundLiteralExpr(SourceLocation(), superType, ILE, false);
+                                             SourceLocation(), false);
+        SuperRep = new CompoundLiteralExpr(SourceLocation(), superType, ILE,
+                                           false);
       }
       // struct objc_super *
       Expr *Unop = new UnaryOperator(SuperRep, UnaryOperator::AddrOf,
@@ -2189,7 +2190,7 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {
         // (struct objc_super) { <exprs from above> }
         InitListExpr *ILE = new InitListExpr(SourceLocation(), 
                                              &InitExprs[0], InitExprs.size(), 
-                                             SourceLocation());
+                                             SourceLocation(), false);
         SuperRep = new CompoundLiteralExpr(SourceLocation(), superType, ILE, false);
       }
       // struct objc_super *
index 71fddf561cf2012be9a14c20ece309dfc69ce844..407f193e31ba6df40ef04375601b43550ca12b04 100644 (file)
                DEAEECAE0A5AF0FA0045101B /* Driver */ = {
                        isa = PBXGroup;
                        children = (
-                               35A057E60EAE2DDD0069249F /* CacheTokens.cpp */,
                                DE5932CD0AD60FF400BC794C /* clang.cpp */,
                                DE5932CE0AD60FF400BC794C /* clang.h */,
                                359DBBE20E1ACD4700F43FA0 /* AnalysisConsumer.h */,
                                352028460E2C16820096ADE0 /* Analyses.def */,
                                DE3985780CB8ADC800223765 /* ASTConsumers.h */,
                                DE39857A0CB8ADCB00223765 /* ASTConsumers.cpp */,
+                               35A057E60EAE2DDD0069249F /* CacheTokens.cpp */,
                                DE38CF150D8C9DE000A273B6 /* DiagChecker.cpp */,
                                72D16C210D9975EA00E6DA4A /* HTMLPrint.cpp */,
                                DE5932CF0AD60FF400BC794C /* PrintParserCallbacks.cpp */,
index de4f4f75bb1fa72b2c5d05d50a76890e12688fdb..e2db4032f83d96fd571e6f27e54638a18c774572 100644 (file)
@@ -1410,11 +1410,17 @@ public:
 class InitListExpr : public Expr {
   std::vector<Stmt *> InitExprs;
   SourceLocation LBraceLoc, RBraceLoc;
+  
+  /// HadDesignators - Return true if there were any designators in this
+  /// init list expr.  FIXME: this should be replaced by storing the designators
+  /// somehow and updating codegen.
+  bool HadDesignators;
 public:
   InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits,
-               SourceLocation rbraceloc);
+               SourceLocation rbraceloc, bool HadDesignators);
   
   unsigned getNumInits() const { return InitExprs.size(); }
+  bool hadDesignators() const { return HadDesignators; }
   
   const Expr* getInit(unsigned Init) const { 
     assert(Init < getNumInits() && "Initializer access out of range!");
index c20ca25f283c5baa3562f602fd5b6bd74f7b0dcb..f18586fb7092f0b63726bafda38e2c6928cf880d 100644 (file)
@@ -204,13 +204,12 @@ const char *BinaryOperator::getOpcodeStr(Opcode Op) {
 }
 
 InitListExpr::InitListExpr(SourceLocation lbraceloc, 
-                           Expr **initexprs, unsigned numinits,
-                           SourceLocation rbraceloc)
+                           Expr **initExprs, unsigned numInits,
+                           SourceLocation rbraceloc, bool hadDesignators)
   : Expr(InitListExprClass, QualType()),
-    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc)
-{
-  for (unsigned i = 0; i != numinits; i++)
-    InitExprs.push_back(initexprs[i]);
+    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), HadDesignators(hadDesignators) {
+
+  InitExprs.insert(InitExprs.end(), initExprs, initExprs+numInits);
 }
 
 /// getFunctionType - Return the underlying function type for this block.
index fee94568b78c5f497663b87d8e4c045f55d2798f..5304fd9f7a55107e56ec0cae94b44722c1349032 100644 (file)
@@ -22,6 +22,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Parse/DeclSpec.h"
+#include "clang/Parse/Designator.h"
 #include "clang/Parse/Scope.h"
 using namespace clang;
 
@@ -1260,7 +1261,8 @@ ActOnInitList(SourceLocation LBraceLoc, ExprTy **initlist, unsigned NumInit,
   // Semantic analysis for initializers is done by ActOnDeclarator() and
   // CheckInitializer() - it requires knowledge of the object being intialized. 
   
-  InitListExpr *E = new InitListExpr(LBraceLoc, InitList, NumInit, RBraceLoc);
+  InitListExpr *E = new InitListExpr(LBraceLoc, InitList, NumInit, RBraceLoc,
+                                     Designators.hasAnyDesignators());
   E->setType(Context.VoidTy); // FIXME: just a place holder for now.
   return E;
 }
index 12ca3820dd495c23c5ba94c0bbf1ffb3b2a6d425..0e627a1aab4af8e6e27e9fcd114c4ef68acd33d2 100644 (file)
@@ -87,7 +87,8 @@ void InitListChecker::CheckImplicitInitList(InitListExpr *ParentIList,
   // Synthesize an "implicit" InitListExpr (marked by the invalid source locs).
   InitListExpr *ILE = new InitListExpr(SourceLocation(), 
                                        &InitExprs[0], InitExprs.size(), 
-                                       SourceLocation());
+                                       SourceLocation(),
+                                       ParentIList->hadDesignators());
   ILE->setType(T);
 
   // Modify the parent InitListExpr to point to the implicit InitListExpr.