This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Type-punning



On Tue, 26 Jun 2007, Silvius Rus wrote:

> Herman Geza wrote:
> > void foo(float *a) {
> > 	int *b = (int*)a; // type-punning warning
> > 
> > 	// here, access to a and b shouldn't be optimized, as the compiler
> > knows that a and b point to the same address
> > }
> > 
> > Is this reasonable?
> >   
> Even if it were trivial to implement, I would vote against it, because it
> would encourage people to write non-compliant code.

Agreed, if it results in non-compilant code.  I have problems with 
aliasing  when GCC (I think) incorrectly treats types different, but 
they're the same.  For example, I have:

struct Point {
	float x, y, z;
};

struct Vector {
	float x, y, z;

	Point &asPoint() {
		return reinterpret_cast<Point&>(*this);
	}
};

Point and Vector have the same layout, but GCC treats them different when 
it does aliasing analysis.  I have problems when I use Vector::asPoint.  
I use asPoint very trivially, it is very easy to detect (for a human) 
that references point to the same address.  Like

void doSomething(Point p) {
	// do something with p
}

void fv() {
	Point a, b;

	// initialize a & b

	doSomething((a-b).asPoint()); // a-b results in a Vector
}

Here, there's a bad compilation (I think) at the call of doSomething.

I solved my problem with 

struct Vector {
	Point toPoint() {
		return Point(x, y, z);
	}
};

GCC optimizes this as well, but I use other compilers which don't.  It is 
not a big issue, I just wanted to know some background behind the warning 
:)  Thanks for your responses.

Geza


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]