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: [email protected]
ReportedBy: [email protected]
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).