<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </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 --- - clang fails with linker error at -O1 and above on x86_64-linux-gnu"
   href="https://llvm.org/bugs/show_bug.cgi?id=25452">25452</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>clang fails with linker error at -O1 and above on x86_64-linux-gnu
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>trunk
          </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>normal
          </td>
        </tr>

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

        <tr>
          <th>Component</th>
          <td>-New Bugs
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>su@cs.ucdavis.edu
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>The following code causes a linker error when it is compiled on
x86_64-linux-gnu by the current clang trunk at -O1 and above in the 64-bit mode
(but not in the 32-bit mode). 

It seems to also affect all earlier versions of clang (at least 3.0 and later). 

The code in fn1 is obviously bad, but clang does not issue any warnings
(neither does GCC). Is there a reason for this?  Is it because fn1 is unused,
thus dead?  


$ clang-trunk -v
clang version 3.8.0 (trunk 252412)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/tools/bin
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.2
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.1.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.4.7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.6.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.7.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.4
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.1.0
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64

$ clang-trunk -m64 -O0 small.c
$ clang-trunk -m32 -O1 small.c

$ clang-trunk -m64 -O1 small.c
/tmp/small-9c083b.o: In function `fn1':
small.c:(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol
`a' defined in COMMON section in /tmp/small-9c083b.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$

$  
$ clang-trunk -Weverything small.c
small.c:6:1: warning: no previous prototype for function 'fn1'
[-Wmissing-prototypes]
fn1 ()
^
small.c:7:1: warning: function 'fn1' could be declared with attribute
'noreturn' [-Wmissing-noreturn]
{
^
small.c:3:5: warning: no previous extern declaration for non-static variable
'a' [-Wmissing-variable-declarations]
int a[1];
    ^
3 warnings generated.

$ gcc-trunk -Wall -Wextra -pedantic -std=c99 small.c 



---------------------------------


int printf (const char *, ...);

int a[1];

void
fn1 ()
{
  int b = -2000000, c = 0;
  for (;; c++)
    printf ("%d\n", a[b+c]);
}

int
main ()
{
  return 0;
}</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>