<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Hello Gabor,<br>
      <br>
      I did not encounter the problem before. Would you let me to
      investigate the problem a bit more?<br>
      <br>
      <br>
      30.11.2017 15:17, Gábor Horváth пишет:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAPRL4a2ULfrOP1RV0yijm=xhnrqq2iQT3fWgxyiztg3mraiCRg@mail.gmail.com">
      <div dir="ltr">
        <div>
          <div>
            <div>+ Aleksei<br>
              <br>
            </div>
            Hi Aleksei!<br>
            <br>
          </div>
          Did you encounter this problem? Do you have a solution?</div>
        <div>What I do not like about this one, the Importer will end up
          visiting some of the nodes twice.</div>
        <div><br>
        </div>
        <div>Regards,</div>
        <div>Gábor<br>
        </div>
        <div>
          <div>
            <div>
              <div>
                <div class="gmail_extra"><br>
                  <div class="gmail_quote">On 17 November 2017 at 15:33,
                    Rafael·Stahl <span dir="ltr"><<a
                        href="mailto:r.stahl@tum.de" target="_blank"
                        moz-do-not-send="true">r.stahl@tum.de</a>></span>
                    wrote:<br>
                    <blockquote class="gmail_quote" style="margin:0 0 0
                      .8ex;border-left:1px #ccc solid;padding-left:1ex">
                      <div text="#000000" bgcolor="#FFFFFF">
                        <p>Hello Gábor,</p>
                        <p>thank you for the fix! I can confirm that
                          this is working for me.</p>
                        <p>Unfortunately, I don't think I'd be able to
                          properly fix this, because it is unclear to me
                          how the code distributes responsibilities. For
                          example I wouldn't be able to tell that your
                          fix is a dirty one and where else this should
                          be handled. Import(Decl*), VisitEnumDecl,
                          VisitEnumConstantDecl, VisitEnumType or a new
                          VisitTagDecl all kind of touch this topic and
                          interconnect.<br>
                        </p>
                        <p>Should I file a bug to make sure this is not
                          forgotten?</p>
                        <p>Best regards<span class="HOEnZb"><font
                              color="#888888"><br>
                              Rafael<br>
                            </font></span></p>
                        <div>
                          <div class="h5"> <br>
                            <div
                              class="m_-565066877554878776moz-cite-prefix">On
                              16/11/17 17:42, Gábor Horváth wrote:<br>
                            </div>
                            <blockquote type="cite">
                              <div dir="ltr">
                                <div>
                                  <div>
                                    <div>Hi Rafael!<br>
                                      <br>
                                    </div>
                                    Yeah, the cross TU patch is a great
                                    way to detect issues with the
                                    ASTImporter and unfortunately, those
                                    issues are extremely hard to debug.<br>
                                    <br>
                                  </div>
                                  Here, it looks like the source of the
                                  problem is that, when we import an
                                  EnumConstantDecl, we will import the
                                  EnumDecl without the typdef part.</div>
                                <div>A dirty quick fix for this
                                  particular case:</div>
                                <div><br>
                                </div>
                                <div>@@ -1782,6 +1807,11 @@ Decl
                                  *ASTNodeImporter::<wbr>VisitEnumConstantDecl(<wbr>EnumConstantDecl
                                  *D) {<br>
                                     DeclarationName Name;<br>
                                     SourceLocation Loc;<br>
                                     NamedDecl *ToD;<br>
                                  +  auto *ED =
                                  cast<EnumDecl>(D-><wbr>getDeclContext());<br>
                                  +  if (auto *TND =
                                  ED->getTypedefNameForAnonDecl(<wbr>))
                                  {<br>
                                  +    if (!Importer.Import(TND))<br>
                                  +      return nullptr;<br>
                                  +  }<br>
                                     if (ImportDeclParts(D, DC,
                                  LexicalDC, Name, ToD, Loc))<br>
                                       return nullptr;<br>
                                     if (ToD)<br>
                                  <br>
                                </div>
                                <div>I did not have time yet to deep
                                  dive into this and look at what the
                                  proper solution would be. Are you
                                  willing to continue to investigate
                                  this?</div>
                                <div><br>
                                </div>
                                <div>Regards,</div>
                                <div>Gábor<br>
                                </div>
                              </div>
                              <div class="gmail_extra"><br>
                                <div class="gmail_quote">On 13 November
                                  2017 at 12:16, Rafael·Stahl via
                                  cfe-dev <span dir="ltr"><<a
                                      href="mailto:cfe-dev@lists.llvm.org"
                                      target="_blank"
                                      moz-do-not-send="true">cfe-dev@lists.llvm.org</a>></span>
                                  wrote:<br>
                                  <blockquote class="gmail_quote"
                                    style="margin:0 0 0
                                    .8ex;border-left:1px #ccc
                                    solid;padding-left:1ex">Deal all<br>
                                    <br>
                                    While using the static analyzer with
                                    cross translation unit support ( <a
href="https://reviews.llvm.org/D30691" rel="noreferrer" target="_blank"
                                      moz-do-not-send="true">https://reviews.llvm.org/D3069<wbr>1</a>
                                    ), I stumbled upon an issue that is
                                    most likely related to the
                                    ASTImporter.<br>
                                    <br>
                                    I'm using a custom checker, but this
                                    should be reproduced by just running
                                    the scan-build tool.<br>
                                    <br>
                                    A simple reproducing example:<br>
                                    <br>
                                    main.c:<br>
                                    <br>
                                    ------------------------------<wbr>---------<br>
                                    void foo();<br>
                                    void moo();<br>
                                    <br>
                                    int main()<br>
                                    {<br>
                                        foo();<br>
                                        moo();<br>
                                    }<br>
                                    ------------------------------<wbr>---------<br>
                                    <br>
                                    foo.c:<br>
                                    <br>
                                    ------------------------------<wbr>---------<br>
                                    #include "thing.h"<br>
                                    <br>
                                    void foo()<br>
                                    {<br>
                                        (void)THING_VALUE;<br>
                                    }<br>
                                    <br>
                                    void conflict(thing_t type)<br>
                                    {<br>
                                    }<br>
                                    ------------------------------<wbr>---------<br>
                                    <br>
                                    moo.c:<br>
                                    <br>
                                    ------------------------------<wbr>---------<br>
                                    #include "thing.h"<br>
                                    <br>
                                    void moo()<br>
                                    {<br>
                                        conflict(THING_VALUE);<br>
                                    }<br>
                                    ------------------------------<wbr>---------<br>
                                    <br>
                                    thing.h:<br>
                                    <br>
                                    ------------------------------<wbr>---------<br>
                                    typedef enum {<br>
                                        THING_VALUE<br>
                                    } thing_t;<br>
                                    <br>
                                    void conflict(thing_t type);<br>
                                    ------------------------------<wbr>---------<br>
                                    <br>
                                    Notes on particularities of this
                                    example:<br>
                                    <br>
                                    - main.c needs to NOT include the
                                    header<br>
                                    - main() needs to call the functions
                                    in this order<br>
                                    - foo() needs to reference the
                                    enumerator<br>
                                    - the enum needs to be typedef'd<br>
                                    <br>
                                    If any of the above points do not
                                    apply, the issue does not appear.<br>
                                    <br>
                                    The issue:<br>
                                    <br>
                                    ------------------------------<wbr>---------<br>
                                    In file included from moo.c:1:<br>
                                    thing.h:1:9: warning: type 'thing_t'
                                    has incompatible<br>
                                          definitions in different
                                    translation units [-Wodr]<br>
                                    typedef enum {<br>
                                            ^<br>
                                    thing.h:2:5: note: enumerator
                                    'THING_VALUE' with value 0 here<br>
                                        THING_VALUE<br>
                                        ^<br>
                                    thing.h:1:9: note: no corresponding
                                    enumerator here<br>
                                    foo.c:8:6: error: external function
                                    'conflict' declared<br>
                                          with incompatible types in
                                    different translation units ('void
                                    (thing_t)' vs. 'void (thing_t)')<br>
                                    void conflict(thing_t type)<br>
                                         ^<br>
                                    thing.h:5:6: note: declared here
                                    with type<br>
                                          'void (thing_t)'<br>
                                    void conflict(thing_t type);<br>
                                         ^<br>
                                    ------------------------------<wbr>---------<br>
                                    <br>
                                    After importing conflict(thing_t)
                                    the ASTImporter compared the
                                    imported one with the original by
                                    structural equivalence. This reveals
                                    that in the imported enum the
                                    enumerators are missing, causing the
                                    above error.<br>
                                    <br>
                                    In my real code, not this example, I
                                    was unable to dump the imported
                                    EnumDecl, because it eventually
                                    calls SourceManager::isBeforeInTrans<wbr>lationUnit
                                    with two SourceLocations from
                                    different files. Not sure if this is
                                    related.<br>
                                    <br>
                                    I have tried adding:<br>
                                    <br>
                                    for (const auto Enumerator :
                                    D->enumerators())<br>
                                       
                                    D2->addDecl(Importer.Import(En<wbr>umerator));<br>
                                    <br>
                                    before completing the definition in
                                    ASTNodeImporter::VisitEnumDecl<wbr>(),
                                    but that results in:<br>
                                    <br>
                                    exe: tools/clang/lib/AST/DeclBase.c<wbr>pp:1374:
                                    void clang::DeclContext::addHiddenD<wbr>ecl(clang::Decl*):
                                    Assertion
                                    `!D->getNextDeclInContext()
                                    && D != LastDecl &&
                                    "Decl already inserted into a
                                    DeclContext"' failed.<br>
                                    <br>
                                    I'm not familiar enough with the
                                    ASTImporter to help myself further
                                    here. Does anyone know what could be
                                    the issue?<br>
                                    <br>
                                    Best regards<span
                                      class="m_-565066877554878776HOEnZb"><font
                                        color="#888888"><br>
                                        Rafael Stahl<br>
                                        <br>
                                        <br>
                                      </font></span><br>
                                    ______________________________<wbr>_________________<br>
                                    cfe-dev mailing list<br>
                                    <a
                                      href="mailto:cfe-dev@lists.llvm.org"
                                      target="_blank"
                                      moz-do-not-send="true">cfe-dev@lists.llvm.org</a><br>
                                    <a
                                      href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev"
                                      rel="noreferrer" target="_blank"
                                      moz-do-not-send="true">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
                                    <br>
                                  </blockquote>
                                </div>
                                <br>
                              </div>
                            </blockquote>
                            <br>
                          </div>
                        </div>
                      </div>
                    </blockquote>
                  </div>
                  <br>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <p><br>
    </p>
    <pre class="moz-signature" cols="72">-- 
Best regards,
Aleksei Sidorin,
SRR, Samsung Electronics
</pre>
  </body>
</html>