This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/51392] New: Wrong code with -Os when __attribute__((__const__)) function returns structure
- From: "cyp561 at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 03 Dec 2011 10:09:22 +0000
- Subject: [Bug c++/51392] New: Wrong code with -Os when __attribute__((__const__)) function returns structure
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51392
Bug #: 51392
Summary: Wrong code with -Os when __attribute__((__const__))
function returns structure
Classification: Unclassified
Product: gcc
Version: 4.5.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: cyp561@gmail.com
Target: x86_64-pc-linux-gnu
Build: gcc version 4.5.3 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5)
Fails with -Os, works with -O2:
4.5.3
Works always:
4.1.2 4.2.4 4.3.6 4.4.6
Fails always:
3.4.6
Only fails if the copy constructor is manually defined.
Works with __attribute__((__pure__)) instead of __attribute__((__const__)).
Still fails with printf and #include <stdio.h> removed.
Maybe it's somehow illegal with __attribute__((__const__)) to return a
structure with a manually defined copy constructor?
Testcase, reduced as much as I could:
/*
$ g++ -O2 -o error error.cpp
$ ./error
(-11 1 4)
$ g++ -Os -o error error.cpp
$ ./error
(1790250 1127603896 -1465067344)
Aborted
$ ./error
(1801140 -1464045896 574146144)
Aborted
*/
extern "C" void abort();
struct Vector3f
{
Vector3f() {}
Vector3f(int x, int y, int z) : x(x), y(y), z(z) {}
Vector3f(Vector3f const &v) : x(v.x), y(v.y), z(v.z) {} // Essential
int x, y, z;
};
__attribute__((__const__))
Vector3f pie_SurfaceNormal3fv(Vector3f a, Vector3f b)
{
return Vector3f(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x);
}
void normalsOnTile(Vector3f *normals)
{
Vector3f b(3, 5, 7);
Vector3f c(4, 8, 9);
*normals = pie_SurfaceNormal3fv(b, c);
}
#include <stdio.h>
int main()
{
Vector3f normals;
normalsOnTile(&normals);
printf("(%d %d %d)\n", normals.x, normals.y, normals.z);
if (normals.x != -11)
abort();
}