[Bug c++/63157] New: may_alias doesn't work as expected in template nested types
haynberg at sig dot com
gcc-bugzilla@gcc.gnu.org
Wed Sep 3 18:47:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63157
Bug ID: 63157
Summary: may_alias doesn't work as expected in template nested
types
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: haynberg at sig dot com
Basically, I want to build with strict aliasing enabled however I'd like a way
to *programmatically* prevent strict aliasing optimizations if needed. I
believe may_alias is the only way one can do this (please let me know if there
are others).
Here's an example where I know two different-typed pointers may alias. I
wanted a helper class that I could a reuse. Note: this is only for structs
which are POD (as you can't inherit from built-in types; I have another utility
for that).
In the example, may_alias works in the non-template case (case 2) and in the
template case if you use a reference (case 4); but not if you use a pointer
(case 3). Do you know why?
$ cat t.cpp
extern "C" void abort();
struct msg {
long seq_no;
};
struct msg_alias : msg {} __attribute__((may_alias));
template <typename T>
struct test_type {
struct type : T {} __attribute__((may_alias));
};
void check(short *a, msg *b)
{
*a = 5;
// case 1: will abort
// b->seq_no = 6;
// case 2: will not abort; may_alias prevented strict aliasing optimizations
// msg_alias *p = (msg_alias*) b;
// p->seq_no = 6;
// case 3: will abort (but should be the same as case 2)
test_type<msg>::type *p = (test_type<msg>::type*) b;
p->seq_no = 6;
// case 4: will not abort; may_alias prevented strict aliasing optimizations
// test_type<msg>::type &r = * (test_type<msg>::type*) b;
// r.seq_no = 6;
if (*a == 5)
abort();
}
int main()
{
msg m[1];
check((short *) m, m);
}
$ g++ -O3 t.cpp && a.out
Aborted
$ g++ -v
gcc version 4.9.0 (GCC)
$ uname -irs
Linux 3.0.38-0.5-default x86_64
More information about the Gcc-bugs
mailing list