On Fri, Mar 14, 2014 at 3:10 PM, Ben Langmuir <[email protected]> wrote:
>
> On Mar 14, 2014, at 11:59 AM, Aaron Ballman <[email protected]> wrote:
>
>> Sorry to resurrect an old commit, but...
>>
>> On Fri, May 3, 2013 at 3:20 PM, Ben Langmuir <[email protected]> wrote:
>>> Author: benlangmuir
>>> Date: Fri May  3 14:20:19 2013
>>> New Revision: 181048
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=181048&view=rev
>>> Log:
>>> Serialization for captured statements
>>>
>>> Add serialization for captured statements and captured decls.  Also add
>>> a const_capture_iterator to CapturedStmt.
>>>
>>> Test contributed by Wei Pan
>>>
>>> Differential Revision: http://llvm-reviews.chandlerc.com/D727
>>>
>>> Added:
>>>    cfe/trunk/test/PCH/captured-stmt.cpp
>>> Modified:
>>>    cfe/trunk/include/clang/AST/Decl.h
>>>    cfe/trunk/include/clang/AST/Stmt.h
>>>    cfe/trunk/lib/AST/Decl.cpp
>>>    cfe/trunk/lib/AST/Stmt.cpp
>>>    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>>>    cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>>>    cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
>>>    cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>>>
>>> Modified: cfe/trunk/include/clang/AST/Decl.h
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=181048&r1=181047&r2=181048&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/Decl.h (original)
>>> +++ cfe/trunk/include/clang/AST/Decl.h Fri May  3 14:20:19 2013
>>> @@ -3185,10 +3185,14 @@ private:
>>>
>>> public:
>>>   static CapturedDecl *Create(ASTContext &C, DeclContext *DC, unsigned 
>>> NumParams);
>>> +  static CapturedDecl *CreateDeserialized(ASTContext &C, unsigned ID,
>>> +                                          unsigned NumParams);
>>>
>>>   Stmt *getBody() const { return Body; }
>>>   void setBody(Stmt *B) { Body = B; }
>>>
>>> +  unsigned getNumParams() const { return NumParams; }
>>> +
>>>   ImplicitParamDecl *getParam(unsigned i) const {
>>>     assert(i < NumParams);
>>>     return getParams()[i];
>>> @@ -3217,6 +3221,9 @@ public:
>>>   static CapturedDecl *castFromDeclContext(const DeclContext *DC) {
>>>     return static_cast<CapturedDecl *>(const_cast<DeclContext *>(DC));
>>>   }
>>> +
>>> +  friend class ASTDeclReader;
>>> +  friend class ASTDeclWriter;
>>> };
>>>
>>> /// \brief Describes a module import declaration, which makes the contents
>>>
>>> Modified: cfe/trunk/include/clang/AST/Stmt.h
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=181048&r1=181047&r2=181048&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/Stmt.h (original)
>>> +++ cfe/trunk/include/clang/AST/Stmt.h Fri May  3 14:20:19 2013
>>> @@ -1975,6 +1975,7 @@ public:
>>>       assert(!capturesThis() && "No variable available for 'this' capture");
>>>       return VarAndKind.getPointer();
>>>     }
>>> +    friend class ASTStmtReader;
>>>   };
>>>
>>> private:
>>> @@ -2001,6 +2002,8 @@ private:
>>>
>>>   Capture *getStoredCaptures() const;
>>>
>>> +  void setCapturedStmt(Stmt *S) { getStoredStmts()[NumCaptures] = S; }
>>> +
>>> public:
>>>   static CapturedStmt *Create(ASTContext &Context, Stmt *S,
>>>                               ArrayRef<Capture> Captures,
>>> @@ -2026,10 +2029,12 @@ public:
>>>   bool capturesVariable(const VarDecl *Var) const;
>>>
>>>   /// \brief An iterator that walks over the captures.
>>> -  typedef const Capture *capture_iterator;
>>> +  typedef Capture *capture_iterator;
>>> +  typedef const Capture *const_capture_iterator;
>>>
>>>   /// \brief Retrieve an iterator pointing to the first capture.
>>> -  capture_iterator capture_begin() const { return getStoredCaptures(); }
>>> +  capture_iterator capture_begin() { return getStoredCaptures(); }
>>> +  const_capture_iterator capture_begin() const { return 
>>> getStoredCaptures(); }
>>>
>>>   /// \brief Retrieve an iterator pointing past the end of the sequence of
>>>   /// captures.
>>> @@ -2069,6 +2074,8 @@ public:
>>>   }
>>>
>>>   child_range children();
>>> +
>>> +  friend class ASTStmtReader;
>>> };
>>>
>>> }  // end namespace clang
>>>
>>> Modified: cfe/trunk/lib/AST/Decl.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=181048&r1=181047&r2=181048&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/AST/Decl.cpp (original)
>>> +++ cfe/trunk/lib/AST/Decl.cpp Fri May  3 14:20:19 2013
>>> @@ -3249,10 +3249,17 @@ MSPropertyDecl *MSPropertyDecl::CreateDe
>>>
>>> CapturedDecl *CapturedDecl::Create(ASTContext &C, DeclContext *DC,
>>>                                    unsigned NumParams) {
>>> -  unsigned Size = sizeof(CapturedDecl) + NumParams 
>>> *sizeof(ImplicitParamDecl*);
>>> +  unsigned Size = sizeof(CapturedDecl) + NumParams * 
>>> sizeof(ImplicitParamDecl*);
>>>   return new (C.Allocate(Size)) CapturedDecl(DC, NumParams);
>>> }
>>>
>>> +CapturedDecl *CapturedDecl::CreateDeserialized(ASTContext &C, unsigned ID,
>>> +                                   unsigned NumParams) {
>>> +  unsigned Size = sizeof(CapturedDecl) + NumParams * 
>>> sizeof(ImplicitParamDecl*);
>>> +  void *Mem = AllocateDeserializedDecl(C, ID, Size);
>>> +  return new (Mem) CapturedDecl(0, NumParams);
>>> +}
>>> +
>>> EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
>>>                                            SourceLocation L,
>>>                                            IdentifierInfo *Id, QualType T,
>>>
>>> Modified: cfe/trunk/lib/AST/Stmt.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=181048&r1=181047&r2=181048&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/AST/Stmt.cpp (original)
>>> +++ cfe/trunk/lib/AST/Stmt.cpp Fri May  3 14:20:19 2013
>>> @@ -1124,8 +1124,8 @@ Stmt::child_range CapturedStmt::children
>>> }
>>>
>>> bool CapturedStmt::capturesVariable(const VarDecl *Var) const {
>>> -  for (capture_iterator I = capture_begin(),
>>> -                        E = capture_end(); I != E; ++I) {
>>> +  for (const_capture_iterator I = capture_begin(),
>>> +                              E = capture_end(); I != E; ++I) {
>>>     if (I->capturesThis())
>>>       continue;
>>>
>>>
>>> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=181048&r1=181047&r2=181048&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
>>> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Fri May  3 14:20:19 2013
>>> @@ -996,8 +996,11 @@ void ASTDeclReader::VisitBlockDecl(Block
>>>                   captures.end(), capturesCXXThis);
>>> }
>>>
>>> -void ASTDeclReader::VisitCapturedDecl(CapturedDecl *) {
>>> -  llvm_unreachable("not implemented yet");
>>> +void ASTDeclReader::VisitCapturedDecl(CapturedDecl *CD) {
>>> +  VisitDecl(CD);
>>> +  // Body is set by VisitCapturedStmt.
>>> +  for (unsigned i = 0; i < CD->NumParams; ++i)
>>> +    CD->setParam(i, ReadDeclAs<ImplicitParamDecl>(Record, Idx));
>>> }
>>>
>>> void ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
>>> @@ -2153,7 +2156,7 @@ Decl *ASTReader::ReadDeclRecord(DeclID I
>>>     D = MSPropertyDecl::CreateDeserialized(Context, ID);
>>>     break;
>>>   case DECL_CAPTURED:
>>> -    llvm_unreachable("not implemented yet");
>>> +    D = CapturedDecl::CreateDeserialized(Context, ID, Record[Idx++]);
>>>     break;
>>>   case DECL_CXX_BASE_SPECIFIERS:
>>>     Error("attempt to read a C++ base-specifier record as a declaration");
>>>
>>> Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>>> URL: 
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=181048&r1=181047&r2=181048&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
>>> +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Fri May  3 14:20:19 2013
>>> @@ -381,7 +381,29 @@ void ASTStmtReader::VisitMSAsmStmt(MSAsm
>>> }
>>>
>>> void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
>>> -  llvm_unreachable("not implemented yet");
>>> +  VisitStmt(S);
>>> +  S->TheCapturedDecl = ReadDeclAs<CapturedDecl>(Record, Idx);
>>> +  S->TheRecordDecl = ReadDeclAs<RecordDecl>(Record, Idx);
>>> +
>>> +  // Capture inits
>>> +  for (CapturedStmt::capture_init_iterator I = S->capture_init_begin(),
>>> +                                           E = S->capture_init_end();
>>> +       I != E; ++I)
>>> +    *I = Reader.ReadSubExpr();
>>
>> While range-ifying code, I came across this, and I'm wondering: is the
>> assignment supposed to actually do anything? It appears to be spurious
>> (and indeed, removing the assignment causes no regressions in our test
>> suite).
>
> It’s been too long for my memory, but from re-reading the code I don’t see 
> why this would be spurious.. why do you think it is?  We probably just don’t 
> test it well :)
>
> I believe the intent is to read the initializer for this particular capture 
> and store it in the CapturedStmt’s capture initializers.  The iterator will 
> be valid because we allocate these when we create the CapturedStmt.

This was my mistake, so I apologize for the noise. I thought this was
doing an assignment to a *local* pointer, but I see now that it's an
assignment into the pointer stored in S due to the fact that
cpature_init_iterator is an Expr **, not an iterator class.

Phew. :-)

Thanks for letting me bug you on it.

~Aaron

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to