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 <[email protected] <mailto:[email protected]>> 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
    [email protected] <mailto:[email protected]>
    http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




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

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

Reply via email to