<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - adding 'weak' on a redeclaration after the first use is unsound"
   href="https://bugs.llvm.org/show_bug.cgi?id=47663">47663</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>adding 'weak' on a redeclaration after the first use is unsound
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>C++
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>richard-llvm@metafoo.co.uk
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>blitzrakete@gmail.com, dgregor@apple.com, erik.pilkington@gmail.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Consider:

void f();
bool b = f;
void f() __attribute__((weak));

Clang emits 'b' constant-initialized to 'true', because that is the result of
evaluating the initializer at the point where it appears. (The language
semantics require us to evaluate the initializer at that point, and require
that initializer to be a constant expression that evaluates to 'true'.)

GCC handles this by rejecting the redeclaration:

<source>:1:6: error: 'void f()' declared weak after being used
    1 | void f();
      |      ^

However, GCC does accept this:

void f();
void g() { f(); }
void f() __attribute__((weak));

... so it's not entirely clear what rule they're using.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>