[cfe-commits] r104712 - in /cfe/trunk: include/clang/AST/DeclCXX.h lib/AST/DeclCXX.cpp lib/Sema/SemaDeclCXX.cpp

Abramo Bagnara abramo.bagnara at gmail.com
Wed May 26 11:09:23 PDT 2010


Author: abramo
Date: Wed May 26 13:09:23 2010
New Revision: 104712

URL: http://llvm.org/viewvc/llvm-project?rev=104712&view=rev
Log:
Added source order to CXXBaseOrMemberInitializer.

Modified:
    cfe/trunk/include/clang/AST/DeclCXX.h
    cfe/trunk/lib/AST/DeclCXX.cpp
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp

Modified: cfe/trunk/include/clang/AST/DeclCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=104712&r1=104711&r2=104712&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclCXX.h (original)
+++ cfe/trunk/include/clang/AST/DeclCXX.h Wed May 26 13:09:23 2010
@@ -1068,14 +1068,20 @@
   /// RParenLoc - Location of the right paren of the ctor-initializer.
   SourceLocation RParenLoc;
 
-  /// \brief The number of array index variables stored after this object
-  /// in memory.
-  unsigned NumArrayIndices;
-  
   /// IsVirtual - If the initializer is a base initializer, this keeps track
   /// of whether the base is virtual or not.
-  bool IsVirtual;
-  
+  bool IsVirtual : 1;
+
+  /// IsWritten - Whether or not the initializer is explicitly written
+  /// in the sources.
+  bool IsWritten : 1;
+  /// SourceOrderOrNumArrayIndices - If IsImplicit is false, then this
+  /// number keeps track of the textual order of this initializer in the
+  /// original sources, counting from 0; otherwise, if IsImplicit is true,
+  /// it stores the number of array index variables stored after this
+  /// object in memory.
+  unsigned SourceOrderOrNumArrayIndices : 14;
+
   CXXBaseOrMemberInitializer(ASTContext &Context,
                              FieldDecl *Member, SourceLocation MemberLoc,
                              SourceLocation L,
@@ -1169,6 +1175,30 @@
   
   /// \brief Determine the source range covering the entire initializer.
   SourceRange getSourceRange() const;
+
+  /// isWritten - Returns true if this initializer is explicitly written
+  /// in the source code.
+  bool isWritten() const { return IsWritten; }
+
+  /// \brief Return the source position of the initializer, counting from 0.
+  /// If the initializer was implicit, -1 is returned.
+  int getSourceOrder() const {
+    return IsWritten ? static_cast<int>(SourceOrderOrNumArrayIndices) : -1;
+  }
+
+  /// \brief Set the source order of this initializer. This method can only
+  /// be called once for each initializer; it cannot be called on an
+  /// initializer having a positive number of (implicit) array indices.
+  void setSourceOrder(int pos) {
+    assert(!IsWritten &&
+           "calling twice setSourceOrder() on the same initializer");
+    assert(SourceOrderOrNumArrayIndices == 0 &&
+           "setSourceOrder() used when there are implicit array indices");
+    assert(pos >= 0 &&
+           "setSourceOrder() used to make an initializer implicit");
+    IsWritten = true;
+    SourceOrderOrNumArrayIndices = static_cast<unsigned>(pos);
+  }
   
   FieldDecl *getAnonUnionMember() const {
     return AnonUnionMember;
@@ -1183,20 +1213,22 @@
 
   /// \brief Determine the number of implicit array indices used while
   /// described an array member initialization.
-  unsigned getNumArrayIndices() const { return NumArrayIndices; }
+  unsigned getNumArrayIndices() const {
+    return IsWritten ? 0 : SourceOrderOrNumArrayIndices;
+  }
 
   /// \brief Retrieve a particular array index variable used to 
   /// describe an array member initialization.
   VarDecl *getArrayIndex(unsigned I) {
-    assert(I < NumArrayIndices && "Out of bounds member array index");
+    assert(I < getNumArrayIndices() && "Out of bounds member array index");
     return reinterpret_cast<VarDecl **>(this + 1)[I];
   }
   const VarDecl *getArrayIndex(unsigned I) const {
-    assert(I < NumArrayIndices && "Out of bounds member array index");
+    assert(I < getNumArrayIndices() && "Out of bounds member array index");
     return reinterpret_cast<const VarDecl * const *>(this + 1)[I];
   }
   void setArrayIndex(unsigned I, VarDecl *Index) {
-    assert(I < NumArrayIndices && "Out of bounds member array index");
+    assert(I < getNumArrayIndices() && "Out of bounds member array index");
     reinterpret_cast<VarDecl **>(this + 1)[I] = Index;
   }
   

Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=104712&r1=104711&r2=104712&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Wed May 26 13:09:23 2010
@@ -700,8 +700,9 @@
 CXXBaseOrMemberInitializer(ASTContext &Context,
                            TypeSourceInfo *TInfo, bool IsVirtual,
                            SourceLocation L, Expr *Init, SourceLocation R)
-  : BaseOrMember(TInfo), Init(Init), AnonUnionMember(0), 
-    LParenLoc(L), RParenLoc(R), NumArrayIndices(0), IsVirtual(IsVirtual)
+  : BaseOrMember(TInfo), Init(Init), AnonUnionMember(0),
+    LParenLoc(L), RParenLoc(R), IsVirtual(IsVirtual), IsWritten(false),
+    SourceOrderOrNumArrayIndices(0)
 {
 }
 
@@ -709,9 +710,9 @@
 CXXBaseOrMemberInitializer(ASTContext &Context,
                            FieldDecl *Member, SourceLocation MemberLoc,
                            SourceLocation L, Expr *Init, SourceLocation R)
-  : BaseOrMember(Member), MemberLocation(MemberLoc), Init(Init), 
-    AnonUnionMember(0), LParenLoc(L), RParenLoc(R) , NumArrayIndices(0),
-    IsVirtual(false)
+  : BaseOrMember(Member), MemberLocation(MemberLoc), Init(Init),
+    AnonUnionMember(0), LParenLoc(L), RParenLoc(R), IsVirtual(false),
+    IsWritten(false), SourceOrderOrNumArrayIndices(0)
 {
 }
 
@@ -722,8 +723,8 @@
                            VarDecl **Indices,
                            unsigned NumIndices)
   : BaseOrMember(Member), MemberLocation(MemberLoc), Init(Init), 
-    AnonUnionMember(0), LParenLoc(L), RParenLoc(R) , 
-    NumArrayIndices(NumIndices), IsVirtual(false)
+    AnonUnionMember(0), LParenLoc(L), RParenLoc(R), IsVirtual(false),
+    IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices)
 {
   VarDecl **MyIndices = reinterpret_cast<VarDecl **> (this + 1);
   memcpy(MyIndices, Indices, NumIndices * sizeof(VarDecl *));

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=104712&r1=104711&r2=104712&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed May 26 13:09:23 2010
@@ -2142,6 +2142,9 @@
   for (unsigned i = 0; i < NumMemInits; i++) {
     CXXBaseOrMemberInitializer *Init = MemInits[i];
 
+    // Set the source order index.
+    Init->setSourceOrder(i);
+
     if (Init->isMemberInitializer()) {
       FieldDecl *Field = Init->getMember();
       if (CheckRedundantInit(*this, Init, Members[Field]) ||





More information about the cfe-commits mailing list