On 10/02/2014 01:27 AM, David Blaikie wrote:


On Wed, Oct 1, 2014 at 3:01 AM, Vassil Vassilev <[email protected] <mailto:[email protected]>> wrote:

    We tried to trim down the reproducer, we basically touched each
    line to try to simplify it but unsuccessfully.


Hmm - well, I've managed to simplify it a bit further taking a rather similarly brute force approach (see r218840). I couldn't quite get down to something where I could obviously see the dependencies, but it's something at least.
Thanks! I agree it looks much better now. Out of curiosity: does it hit the same assert in ASTWriter::AddedCXXImplicitMember?
Vassil

    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]  <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

Reply via email to