<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 1/16/2018 11:26 AM, Gabriel Charette
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAJTZ7LLJRBweBuWSCP66qgYjc0ZmzFGSHyQkb-AHFUctw5P_SQ@mail.gmail.com">
      <div dir="ltr"><br>
        <br>
        <div class="gmail_quote">
          <div dir="ltr">On Tue, Jan 16, 2018 at 8:00 PM Richard Smith
            <<a href="mailto:richard@metafoo.co.uk"
              moz-do-not-send="true">richard@metafoo.co.uk</a>>
            wrote:<br>
          </div>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div dir="ltr">
              <div class="gmail_extra">
                <div class="gmail_quote">On 16 January 2018 at 10:43,
                  Friedman, Eli via cfe-dev <span dir="ltr"><<a
                      href="mailto:cfe-dev@lists.llvm.org"
                      target="_blank" class="cremed"
                      moz-do-not-send="true">cfe-dev@lists.llvm.org</a>></span>
                  wrote:<br>
                  <blockquote class="gmail_quote" style="margin:0px 0px
                    0px 0.8ex;border-left:1px solid
                    rgb(204,204,204);padding-left:1ex"><span
                      class="m_-3430430873447914162gmail-">On 1/16/2018
                      4:14 AM, Gabriel Charette via cfe-dev wrote:<br>
                      <blockquote class="gmail_quote" style="margin:0px
                        0px 0px 0.8ex;border-left:1px solid
                        rgb(204,204,204);padding-left:1ex">
                        I would indeed expect, like Primiano, that
                        -Wglobal-constructors would only warn about
                        *con*structors (one can decide to mitigate
                        global *de*structors another way, e.g. by
                        invoking _exit() before end of main()).<br>
                      </blockquote>
                    </span>
                    The point of -Wglobal-constructors is to avoid code
                    which runs at process startup.  Due to the way the
                    C++ ABI works, a global destructor involves emitting
                    a call to __cxa_atexit which runs at startup, so we
                    warn.<br>
                  </blockquote>
                  <div><br>
                  </div>
                </div>
              </div>
            </div>
            <div dir="ltr">
              <div class="gmail_extra">
                <div class="gmail_quote">
                  <div>Well, there are (at least) four distinct problems
                    here:</div>
                  <div><br>
                  </div>
                  <div> 1) Code running at process startup (a
                    performance problem)</div>
                  <div> 2) Code running at process termination (a
                    performance problem)</div>
                  <div> 3) Global variables with non-constant
                    initialization resulting in buggy program startup
                    (called the "initialization order fiasco" by some)</div>
                  <div> 4) Global variables with non-trivial destruction
                    resulting in buggy program shutdown, particularly in
                    multithreaded code (if you have non-trivial global
                    dtors, multiple threads, and you call exit, you
                    typically have a bug)</div>
                  <div><br>
                  </div>
                  <div>It makes sense to request warnings about #3
                    without requesting the more general warnings about
                    #1; as such, ignoring destructors in the
                    -Wglobal-constructors warning would seem reasonable
                    to me. (That allows all four problems to be detected
                    by some combination of the two warning flags.)</div>
                </div>
              </div>
            </div>
          </blockquote>
          <div><br>
          </div>
          <div>Yes, precisely.</div>
          <div><br>
          </div>
          <div>A program can decide to mitigate against 2/4 by
            atomically exiting with _exit() before the end of main() and
            hence truly only want to be warned by 1/3.</div>
          <div><br>
          </div>
        </div>
      </div>
    </blockquote>
    <p>I'm not sure (3) is a problem this warning solves well; there are
      a lot of classes with constructors which aren't constexpr, but
      don't have relevant side-effects (for example, std::vector).  But
      I guess we could introduce a new warning flag.  (We probably don't
      want to change the meaning of the current warning flag for the
      sake of compatibility with existing build systems.)<br>
    </p>
    <p>On a side-note, it would be nice if the following worked to
      suppress global destructors:<br>
    </p>
    <p>struct A { ~A(); };<br>
      template<typename T> union NoDestroy {<br>
        T t;<br>
        constexpr NoDestroy():t{} {}<br>
        constexpr ~NoDestroy() {}<br>
      };<br>
      NoDestroy<A> x;<br>
    </p>
    <p>-Eli<br>
    </p>
    <pre class="moz-signature" cols="72">-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
  </body>
</html>