r218651 - PR20399: Do not assert when adding an implicit member coming from a module at

Vassil Vassilev vasil.georgiev.vasilev at cern.ch
Wed Oct 1 03:01:44 PDT 2014


We tried to trim down the reproducer, we basically touched each line to 
try to simplify it but unsuccessfully. Maybe somebody else more familiar 
with the modules could further reduce it but frankly I doubt it becoming 
a couple of lines.

There is a description of pr20399 here 
http://llvm.org/bugs/show_bug.cgi?id=20399 . If you think it is worth 
mentioning it somewhere in the test case I could come up with a patch.
The idea is that we need to somehow force clang to deserialize a 
CXXRecordDecl and require generation some of its implicit operators at 
pch/pcm build time.
Vassil
On 09/30/2014 06:32 PM, David Blaikie wrote:
> I haven't been watching the modules work closely, and I really 
> understand how hard some of these test cases can be (I've had 
> similarly complex/circularly dependent/etc test cases for debug info 
> in some cases) - but I'll ask anyway: is this test case as simple as 
> it can be? The number of classes and members in PR20399/vector and 
> PR20399/stl_map.h seems pretty high - are all the different access 
> levels necessary too?
>
> If the complexity is required, maybe a summary comment explaining the 
> twisty maze of expansions/ordering of things this tickles might be 
> helpful?
>
> On Mon, Sep 29, 2014 at 5:45 PM, Richard Smith 
> <richard-llvm at metafoo.co.uk <mailto:richard-llvm at metafoo.co.uk>> wrote:
>
>     Author: rsmith
>     Date: Mon Sep 29 19:45:29 2014
>     New Revision: 218651
>
>     URL: http://llvm.org/viewvc/llvm-project?rev=218651&view=rev
>     Log:
>     PR20399: Do not assert when adding an implicit member coming from
>     a module at
>     writing time.
>
>     Patch by Vassil Vassilev!
>
>     Added:
>         cfe/trunk/test/Modules/Inputs/PR20399/
>         cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h
>         cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h
>         cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap
>         cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h
>         cfe/trunk/test/Modules/Inputs/PR20399/vector
>         cfe/trunk/test/Modules/pr20399.cpp
>     Modified:
>         cfe/trunk/lib/Serialization/ASTWriter.cpp
>
>     Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=218651&r1=218650&r2=218651&view=diff
>     ==============================================================================
>     --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
>     +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Mon Sep 29 19:45:29 2014
>     @@ -5708,8 +5708,6 @@ void ASTWriter::CompletedTagDefinition(c
>      }
>
>      void ASTWriter::AddedVisibleDecl(const DeclContext *DC, const
>     Decl *D) {
>     -  assert(!WritingAST && "Already writing the AST!");
>     -
>        // TU and namespaces are handled elsewhere.
>        if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC))
>          return;
>     @@ -5718,12 +5716,12 @@ void ASTWriter::AddedVisibleDecl(const D
>          return; // Not a source decl added to a DeclContext from PCH.
>
>        assert(!getDefinitiveDeclContext(DC) && "DeclContext not
>     definitive!");
>     +  assert(!WritingAST && "Already writing the AST!");
>        AddUpdatedDeclContext(DC);
>        UpdatingVisibleDecls.push_back(D);
>      }
>
>      void ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl *RD,
>     const Decl *D) {
>     -  assert(!WritingAST && "Already writing the AST!");
>        assert(D->isImplicit());
>        if (!(!D->isFromASTFile() && RD->isFromASTFile()))
>          return; // Not a source member added to a class from PCH.
>     @@ -5732,17 +5730,18 @@ void ASTWriter::AddedCXXImplicitMember(c
>
>        // A decl coming from PCH was modified.
>        assert(RD->isCompleteDefinition());
>     +  assert(!WritingAST && "Already writing the AST!");
>      DeclUpdates[RD].push_back(DeclUpdate(UPD_CXX_ADDED_IMPLICIT_MEMBER,
>     D));
>      }
>
>      void ASTWriter::AddedCXXTemplateSpecialization(const
>     ClassTemplateDecl *TD,
>                                           const
>     ClassTemplateSpecializationDecl *D) {
>        // The specializations set is kept in the canonical template.
>     -  assert(!WritingAST && "Already writing the AST!");
>        TD = TD->getCanonicalDecl();
>        if (!(!D->isFromASTFile() && TD->isFromASTFile()))
>          return; // Not a source specialization added to a template
>     from PCH.
>
>     +  assert(!WritingAST && "Already writing the AST!");
>      DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
>                                             D));
>      }
>     @@ -5750,11 +5749,11 @@ void ASTWriter::AddedCXXTemplateSpeciali
>      void ASTWriter::AddedCXXTemplateSpecialization(
>          const VarTemplateDecl *TD, const
>     VarTemplateSpecializationDecl *D) {
>        // The specializations set is kept in the canonical template.
>     -  assert(!WritingAST && "Already writing the AST!");
>        TD = TD->getCanonicalDecl();
>        if (!(!D->isFromASTFile() && TD->isFromASTFile()))
>          return; // Not a source specialization added to a template
>     from PCH.
>
>     +  assert(!WritingAST && "Already writing the AST!");
>      DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
>                                             D));
>      }
>     @@ -5762,11 +5761,11 @@ void ASTWriter::AddedCXXTemplateSpeciali
>      void ASTWriter::AddedCXXTemplateSpecialization(const
>     FunctionTemplateDecl *TD,
>                                                     const FunctionDecl
>     *D) {
>        // The specializations set is kept in the canonical template.
>     -  assert(!WritingAST && "Already writing the AST!");
>        TD = TD->getCanonicalDecl();
>        if (!(!D->isFromASTFile() && TD->isFromASTFile()))
>          return; // Not a source specialization added to a template
>     from PCH.
>
>     +  assert(!WritingAST && "Already writing the AST!");
>      DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
>                                             D));
>      }
>
>     Added: cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h?rev=218651&view=auto
>     ==============================================================================
>     --- cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h (added)
>     +++ cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h Mon Sep 29
>     19:45:29 2014
>     @@ -0,0 +1,17 @@
>     +#ifndef FIRSTHEADER
>     +#define FIRSTHEADER
>     +
>     +#include "SecondHeader.h" // Just a class which gets in the lazy
>     deserialization chain
>     +
>     +#include "stl_map.h"
>     +#include "vector"
>     +struct A {
>     +   typedef std::map<int, int*>::iterator el;
>     +};
>     +
>     +struct B {
>     +  ~B() {}
>     +  std::vector<int> fvec; // Cannot replace with simple mockup
>     +};
>     +
>     +#endif
>
>     Added: cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h?rev=218651&view=auto
>     ==============================================================================
>     --- cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h (added)
>     +++ cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h Mon Sep
>     29 19:45:29 2014
>     @@ -0,0 +1,13 @@
>     +#ifndef SECONDHEADER
>     +#define SECONDHEADER
>     +
>     +#include "vector"
>     +
>     +class Collection {
>     +  template <class T> struct Address { };
>     +};
>     +
>     +template <> struct Collection::Address<std::vector<bool> >
>     +   : public Collection::Address<std::vector<bool>::iterator> { };
>     +
>     +#endif
>
>     Added: cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap?rev=218651&view=auto
>     ==============================================================================
>     --- cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap (added)
>     +++ cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap Mon Sep
>     29 19:45:29 2014
>     @@ -0,0 +1,18 @@
>     +module stdlib [system] {
>     +    header "stl_map.h"
>     +    header "vector"
>     + }
>     +
>     +module libCore {
>     +  header "SecondHeader.h"
>     +    use stdlib
>     +  export *
>     +}
>     +
>     +module libGdml {
>     +  header "FirstHeader.h"
>     +  use libCore
>     +    use stdlib
>     +  export *
>     +}
>     +
>
>     Added: cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h?rev=218651&view=auto
>     ==============================================================================
>     --- cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h (added)
>     +++ cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h Mon Sep 29
>     19:45:29 2014
>     @@ -0,0 +1,25 @@
>     +namespace std
>     +{
>     +  template<typename _Iterator>
>     +  class reverse_iterator {};
>     +
>     +  template<typename _Iterator>
>     +  inline int*
>     +  operator-(const int& __x, const reverse_iterator<_Iterator>&
>     __y) {};
>     +
>     +  template<typename _Tp>
>     +  struct _Rb_tree_iterator
>     +  {
>     +    typedef _Rb_tree_iterator<_Tp>        _Self;
>     +  };
>     +
>     +  template <typename _Key, typename _Tp >
>     +  class map
>     +  {
>     +  public:
>     +    typedef _Rb_tree_iterator<int>        iterator;
>     +
>     +    template<typename _K1, typename _T1>
>     +    friend bool operator<(const map<_K1, _T1>&, const map<_K1,
>     _T1>&);
>     +  };
>     +} // namespace std
>
>     Added: cfe/trunk/test/Modules/Inputs/PR20399/vector
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/vector?rev=218651&view=auto
>     ==============================================================================
>     --- cfe/trunk/test/Modules/Inputs/PR20399/vector (added)
>     +++ cfe/trunk/test/Modules/Inputs/PR20399/vector Mon Sep 29
>     19:45:29 2014
>     @@ -0,0 +1,51 @@
>     +namespace std
>     +{
>     +  template<typename _Tp, typename _Alloc = int>
>     +  class vector
>     +  {
>     +  public:
>     +    int* _M_start;
>     +    int* _M_end_of_storage;
>     +
>     +    ~vector()
>     +    { this->_M_end_of_storage - this->_M_start; }
>     +  };
>     +
>     +  struct _Bit_iterator {};
>     +
>     +  inline int* operator-(const _Bit_iterator& __x, const
>     _Bit_iterator& __y)
>     +  {
>     +    return 0;
>     +  }
>     +
>     +  struct _Bvector_base
>     +  {
>     +    struct _Bvector_impl
>     +    {
>     +      _Bit_iterator     _M_start;
>     +
>     +      _Bvector_impl() { }
>     +    };
>     +
>     +    public:
>     +    ~_Bvector_base()
>     +    { this->_M_deallocate(); }
>     +
>     +  protected:
>     +    _Bvector_impl _M_impl;
>     +
>     +    void _M_deallocate() {}
>     +  };
>     +
>     +  template<typename _Alloc>
>     +  class vector<bool, _Alloc> : protected _Bvector_base
>     +  {
>     +    typedef _Bvector_base                      _Base;
>     +  public:
>     +    typedef _Bit_iterator          iterator;
>     +
>     +    vector()
>     +      : _Base() { }
>     +  };
>     +
>     +} // namespace std
>
>     Added: cfe/trunk/test/Modules/pr20399.cpp
>     URL:
>     http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pr20399.cpp?rev=218651&view=auto
>     ==============================================================================
>     --- cfe/trunk/test/Modules/pr20399.cpp (added)
>     +++ cfe/trunk/test/Modules/pr20399.cpp Mon Sep 29 19:45:29 2014
>     @@ -0,0 +1,2 @@
>     +// RUN: rm -rf %t
>     +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t
>     -fmodule-name=libGdml -emit-module -x c++ -std=c++11
>     %S/Inputs/PR20399/module.modulemap
>
>
>     _______________________________________________
>     cfe-commits mailing list
>     cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
>     http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141001/b277c8b7/attachment.html>


More information about the cfe-commits mailing list