http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48525

           Summary: -O0 produces incorrect results for inlined functions
                    sharing the same name.
           Product: gcc
           Version: 4.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: jroel...@gmail.com


When compiling multiple files with inline functions which share the same
signature and name -O0 produces results inconsistent with -O1, -O2, and -O3
(which produce the expected result).

%> g++ -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5666.3~123/src/configure --disable-checking
--enable-werror --prefix=/usr --mandir=/share/man
--enable-languages=c,objc,c++,obj-c++
--program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib
--build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10-
--host=x86_64-apple-darwin10 --target=i686-apple-darwin10
--with-gxx-include-dir=/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
%> cat double.cpp 
inline int sharedname(int a)
{
    return a + a;
}
int doub(int a)
{
    return sharedname(a);
}
%> cat square.cpp 
inline int sharedname(int a)
{
    return a * a;
}
int square(int a)
{
    return sharedname(a);
}
%> cat main.cpp 
#include "stdio.h"
int square(int a);
int doub(int a);
int main(int argc, char*argv[])
{
    printf("square(3): %d\n", square(3));
    printf("doub(3): %d\n", doub(3));
}
%> g++ main.cpp double.cpp square.cpp -Wall -O3 && ./a.out 
square(3): 9
doub(3): 6
%> g++ main.cpp double.cpp square.cpp -Wall -O2 && ./a.out 
square(3): 9
doub(3): 6
%> g++ main.cpp double.cpp square.cpp -Wall -O1 && ./a.out 
square(3): 9
doub(3): 6
%> g++ main.cpp double.cpp square.cpp -Wall -O0 && ./a.out 
square(3): 6
doub(3): 6

Notice that the last version with -O0 enabled produces 6 instead of 9 for
square(3).

Reply via email to