<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 1, 2014 at 3:01 AM, Vassil Vassilev <span dir="ltr"><<a href="mailto:vasil.georgiev.vasilev@cern.ch" target="_blank">vasil.georgiev.vasilev@cern.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>We tried to trim down the reproducer,
      we basically touched each line to try to simplify it but
      unsuccessfully.</div></div></blockquote><div><br></div><div><span style="font-family:monospace">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.</span><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><div> Maybe somebody else more familiar with the modules
      could further reduce it but frankly I doubt it becoming a couple
      of lines.<br>
      <br>
      There is a description of pr20399 here
      <a href="http://llvm.org/bugs/show_bug.cgi?id=20399" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=20399</a> . If you think it is
      worth mentioning it somewhere in the test case I could come up
      with a patch.<br>
      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.<span class=""><font color="#888888"><br>
      Vassil</font></span><div><div class="h5"><br>
      On 09/30/2014 06:32 PM, David Blaikie wrote:<br>
    </div></div></div><div><div class="h5">
    <blockquote type="cite">
      
      <div dir="ltr">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 <span style="font-family:monospace">PR20399/vector
          and </span><span style="font-family:monospace">PR20399/stl_map.h
          seems pretty high - are all the different access levels
          necessary too?<br>
          <br>
          If the complexity is required, maybe a summary comment
          explaining the twisty maze of expansions/ordering of things
          this tickles might be helpful?</span></div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Mon, Sep 29, 2014 at 5:45 PM,
          Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author:
            rsmith<br>
            Date: Mon Sep 29 19:45:29 2014<br>
            New Revision: 218651<br>
            <br>
            URL: <a href="http://llvm.org/viewvc/llvm-project?rev=218651&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=218651&view=rev</a><br>
            Log:<br>
            PR20399: Do not assert when adding an implicit member coming
            from a module at<br>
            writing time.<br>
            <br>
            Patch by Vassil Vassilev!<br>
            <br>
            Added:<br>
                cfe/trunk/test/Modules/Inputs/PR20399/<br>
                cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h<br>
                cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h<br>
                cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap<br>
                cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h<br>
                cfe/trunk/test/Modules/Inputs/PR20399/vector<br>
                cfe/trunk/test/Modules/pr20399.cpp<br>
            Modified:<br>
                cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
            <br>
            Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=218651&r1=218650&r2=218651&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=218651&r1=218650&r2=218651&view=diff</a><br>
==============================================================================<br>
            --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)<br>
            +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Mon Sep 29
            19:45:29 2014<br>
            @@ -5708,8 +5708,6 @@ void
            ASTWriter::CompletedTagDefinition(c<br>
             }<br>
            <br>
             void ASTWriter::AddedVisibleDecl(const DeclContext *DC,
            const Decl *D) {<br>
            -  assert(!WritingAST && "Already writing the
            AST!");<br>
            -<br>
               // TU and namespaces are handled elsewhere.<br>
               if (isa<TranslationUnitDecl>(DC) ||
            isa<NamespaceDecl>(DC))<br>
                 return;<br>
            @@ -5718,12 +5716,12 @@ void
            ASTWriter::AddedVisibleDecl(const D<br>
                 return; // Not a source decl added to a DeclContext
            from PCH.<br>
            <br>
               assert(!getDefinitiveDeclContext(DC) &&
            "DeclContext not definitive!");<br>
            +  assert(!WritingAST && "Already writing the
            AST!");<br>
               AddUpdatedDeclContext(DC);<br>
               UpdatingVisibleDecls.push_back(D);<br>
             }<br>
            <br>
             void ASTWriter::AddedCXXImplicitMember(const CXXRecordDecl
            *RD, const Decl *D) {<br>
            -  assert(!WritingAST && "Already writing the
            AST!");<br>
               assert(D->isImplicit());<br>
               if (!(!D->isFromASTFile() &&
            RD->isFromASTFile()))<br>
                 return; // Not a source member added to a class from
            PCH.<br>
            @@ -5732,17 +5730,18 @@ void
            ASTWriter::AddedCXXImplicitMember(c<br>
            <br>
               // A decl coming from PCH was modified.<br>
               assert(RD->isCompleteDefinition());<br>
            +  assert(!WritingAST && "Already writing the
            AST!");<br>
             
             DeclUpdates[RD].push_back(DeclUpdate(UPD_CXX_ADDED_IMPLICIT_MEMBER,
            D));<br>
             }<br>
            <br>
             void ASTWriter::AddedCXXTemplateSpecialization(const
            ClassTemplateDecl *TD,<br>
                                                  const
            ClassTemplateSpecializationDecl *D) {<br>
               // The specializations set is kept in the canonical
            template.<br>
            -  assert(!WritingAST && "Already writing the
            AST!");<br>
               TD = TD->getCanonicalDecl();<br>
               if (!(!D->isFromASTFile() &&
            TD->isFromASTFile()))<br>
                 return; // Not a source specialization added to a
            template from PCH.<br>
            <br>
            +  assert(!WritingAST && "Already writing the
            AST!");<br>
             
 DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,<br>
                                                    D));<br>
             }<br>
            @@ -5750,11 +5749,11 @@ void
            ASTWriter::AddedCXXTemplateSpeciali<br>
             void ASTWriter::AddedCXXTemplateSpecialization(<br>
                 const VarTemplateDecl *TD, const
            VarTemplateSpecializationDecl *D) {<br>
               // The specializations set is kept in the canonical
            template.<br>
            -  assert(!WritingAST && "Already writing the
            AST!");<br>
               TD = TD->getCanonicalDecl();<br>
               if (!(!D->isFromASTFile() &&
            TD->isFromASTFile()))<br>
                 return; // Not a source specialization added to a
            template from PCH.<br>
            <br>
            +  assert(!WritingAST && "Already writing the
            AST!");<br>
             
 DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,<br>
                                                    D));<br>
             }<br>
            @@ -5762,11 +5761,11 @@ void
            ASTWriter::AddedCXXTemplateSpeciali<br>
             void ASTWriter::AddedCXXTemplateSpecialization(const
            FunctionTemplateDecl *TD,<br>
                                                            const
            FunctionDecl *D) {<br>
               // The specializations set is kept in the canonical
            template.<br>
            -  assert(!WritingAST && "Already writing the
            AST!");<br>
               TD = TD->getCanonicalDecl();<br>
               if (!(!D->isFromASTFile() &&
            TD->isFromASTFile()))<br>
                 return; // Not a source specialization added to a
            template from PCH.<br>
            <br>
            +  assert(!WritingAST && "Already writing the
            AST!");<br>
             
 DeclUpdates[TD].push_back(DeclUpdate(UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,<br>
                                                    D));<br>
             }<br>
            <br>
            Added: cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h?rev=218651&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h?rev=218651&view=auto</a><br>
==============================================================================<br>
            --- cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h
            (added)<br>
            +++ cfe/trunk/test/Modules/Inputs/PR20399/FirstHeader.h Mon
            Sep 29 19:45:29 2014<br>
            @@ -0,0 +1,17 @@<br>
            +#ifndef FIRSTHEADER<br>
            +#define FIRSTHEADER<br>
            +<br>
            +#include "SecondHeader.h" // Just a class which gets in the
            lazy deserialization chain<br>
            +<br>
            +#include "stl_map.h"<br>
            +#include "vector"<br>
            +struct A {<br>
            +   typedef std::map<int, int*>::iterator el;<br>
            +};<br>
            +<br>
            +struct B {<br>
            +  ~B() {}<br>
            +  std::vector<int> fvec; // Cannot replace with
            simple mockup<br>
            +};<br>
            +<br>
            +#endif<br>
            <br>
            Added: cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h?rev=218651&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h?rev=218651&view=auto</a><br>
==============================================================================<br>
            --- cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h
            (added)<br>
            +++ cfe/trunk/test/Modules/Inputs/PR20399/SecondHeader.h Mon
            Sep 29 19:45:29 2014<br>
            @@ -0,0 +1,13 @@<br>
            +#ifndef SECONDHEADER<br>
            +#define SECONDHEADER<br>
            +<br>
            +#include "vector"<br>
            +<br>
            +class Collection {<br>
            +  template <class T> struct Address { };<br>
            +};<br>
            +<br>
            +template <> struct
            Collection::Address<std::vector<bool> ><br>
            +   : public
            Collection::Address<std::vector<bool>::iterator>
            { };<br>
            +<br>
            +#endif<br>
            <br>
            Added:
            cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap?rev=218651&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap?rev=218651&view=auto</a><br>
==============================================================================<br>
            --- cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap
            (added)<br>
            +++ cfe/trunk/test/Modules/Inputs/PR20399/module.modulemap
            Mon Sep 29 19:45:29 2014<br>
            @@ -0,0 +1,18 @@<br>
            +module stdlib [system] {<br>
            +    header "stl_map.h"<br>
            +    header "vector"<br>
            + }<br>
            +<br>
            +module libCore {<br>
            +  header "SecondHeader.h"<br>
            +    use stdlib<br>
            +  export *<br>
            +}<br>
            +<br>
            +module libGdml {<br>
            +  header "FirstHeader.h"<br>
            +  use libCore<br>
            +    use stdlib<br>
            +  export *<br>
            +}<br>
            +<br>
            <br>
            Added: cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h?rev=218651&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h?rev=218651&view=auto</a><br>
==============================================================================<br>
            --- cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h (added)<br>
            +++ cfe/trunk/test/Modules/Inputs/PR20399/stl_map.h Mon Sep
            29 19:45:29 2014<br>
            @@ -0,0 +1,25 @@<br>
            +namespace std<br>
            +{<br>
            +  template<typename _Iterator><br>
            +  class reverse_iterator {};<br>
            +<br>
            +  template<typename _Iterator><br>
            +  inline int*<br>
            +  operator-(const int& __x, const
            reverse_iterator<_Iterator>& __y) {};<br>
            +<br>
            +  template<typename _Tp><br>
            +  struct _Rb_tree_iterator<br>
            +  {<br>
            +    typedef _Rb_tree_iterator<_Tp>        _Self;<br>
            +  };<br>
            +<br>
            +  template <typename _Key, typename _Tp ><br>
            +  class map<br>
            +  {<br>
            +  public:<br>
            +    typedef _Rb_tree_iterator<int>        iterator;<br>
            +<br>
            +    template<typename _K1, typename _T1><br>
            +    friend bool operator<(const map<_K1,
            _T1>&, const map<_K1, _T1>&);<br>
            +  };<br>
            +} // namespace std<br>
            <br>
            Added: cfe/trunk/test/Modules/Inputs/PR20399/vector<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/vector?rev=218651&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/PR20399/vector?rev=218651&view=auto</a><br>
==============================================================================<br>
            --- cfe/trunk/test/Modules/Inputs/PR20399/vector (added)<br>
            +++ cfe/trunk/test/Modules/Inputs/PR20399/vector Mon Sep 29
            19:45:29 2014<br>
            @@ -0,0 +1,51 @@<br>
            +namespace std<br>
            +{<br>
            +  template<typename _Tp, typename _Alloc = int><br>
            +  class vector<br>
            +  {<br>
            +  public:<br>
            +    int* _M_start;<br>
            +    int* _M_end_of_storage;<br>
            +<br>
            +    ~vector()<br>
            +    { this->_M_end_of_storage - this->_M_start; }<br>
            +  };<br>
            +<br>
            +  struct _Bit_iterator {};<br>
            +<br>
            +  inline int* operator-(const _Bit_iterator& __x, const
            _Bit_iterator& __y)<br>
            +  {<br>
            +    return 0;<br>
            +  }<br>
            +<br>
            +  struct _Bvector_base<br>
            +  {<br>
            +    struct _Bvector_impl<br>
            +    {<br>
            +      _Bit_iterator     _M_start;<br>
            +<br>
            +      _Bvector_impl() { }<br>
            +    };<br>
            +<br>
            +    public:<br>
            +    ~_Bvector_base()<br>
            +    { this->_M_deallocate(); }<br>
            +<br>
            +  protected:<br>
            +    _Bvector_impl _M_impl;<br>
            +<br>
            +    void _M_deallocate() {}<br>
            +  };<br>
            +<br>
            +  template<typename _Alloc><br>
            +  class vector<bool, _Alloc> : protected
            _Bvector_base<br>
            +  {<br>
            +    typedef _Bvector_base                      _Base;<br>
            +  public:<br>
            +    typedef _Bit_iterator          iterator;<br>
            +<br>
            +    vector()<br>
            +      : _Base() { }<br>
            +  };<br>
            +<br>
            +} // namespace std<br>
            <br>
            Added: cfe/trunk/test/Modules/pr20399.cpp<br>
            URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pr20399.cpp?rev=218651&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pr20399.cpp?rev=218651&view=auto</a><br>
==============================================================================<br>
            --- cfe/trunk/test/Modules/pr20399.cpp (added)<br>
            +++ cfe/trunk/test/Modules/pr20399.cpp Mon Sep 29 19:45:29
            2014<br>
            @@ -0,0 +1,2 @@<br>
            +// RUN: rm -rf %t<br>
            +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t
            -fmodule-name=libGdml -emit-module -x c++ -std=c++11
            %S/Inputs/PR20399/module.modulemap<br>
            <br>
            <br>
            _______________________________________________<br>
            cfe-commits mailing list<br>
            <a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
            <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
          </blockquote>
        </div>
        <br>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      <pre>_______________________________________________
cfe-commits mailing list
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a>
</pre>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div></div>