http://llvm.org/bugs/show_bug.cgi?id=8314

           Summary: Incorrect code generated with prototypes and old-style
                    function definitions.
           Product: clang
           Version: 2.8
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: -New Bugs
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected]


When using old-style function definitions, clang seems to be ignoring any
prototypes that occur prior to the definition.  This causes incorrect
code to be generated because required conversions are not performed.

Consider the following example:

  #include <stdio.h>

  void foo(int);
  void foo(x)
    int x;
  {
    printf("%d\n", x);
  }

  int main(void)
  {
    /* The double argument here should be converted
       to int according to the prototype. */

    foo(42.0);
    return 0;
  }

But running clang test.c emits the following code for main:

  0000000000400570 <main>:
    400570:    55                       push   %rbp
    400571:    48 89 e5                 mov    %rsp,%rbp
    400574:    48 83 ec 10              sub    $0x10,%rsp
    400578:    b8 00 00 00 00           mov    $0x0,%eax
    40057d:    c7 45 fc 00 00 00 00     movl   $0x0,-0x4(%rbp)
    400584:    f2 0f 10 05 04 01 00     movsd  0x104(%rip),%xmm0        #
400690 <_IO_stdin_used+0x8>
    40058b:    00 
    40058c:    89 45 f8                 mov    %eax,-0x8(%rbp)
    40058f:    b0 01                    mov    $0x1,%al
    400591:    e8 aa ff ff ff           callq  400540 <foo>
    400596:    8b 45 f8                 mov    -0x8(%rbp),%eax
    400599:    48 83 c4 10              add    $0x10,%rsp
    40059d:    5d                       pop    %rbp
    40059e:    c3                       retq   
    40059f:    90                       nop

which, of course, means foo is passed whatever happened to be in %edi at the
time, rather than 42 as expected (e.g., it prints the number of command-line
arguments on my system).

If the prototype is moved after the function definition, the program works
properly.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to