Hi,
After applied a patch to GCC to make it warn about strict aliasing
violating, like this:
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index b6ecaa4..95e745c 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -2913,6 +2913,10 @@ setup_one_parameter (copy_body_data *id, tree p, tree
value, tree fn,
}
}
+ if (warn_strict_aliasing > 2)
+ if (strict_aliasing_warning (TREE_TYPE (rhs), TREE_TYPE(p), rhs))
+ warning (OPT_Wstrict_aliasing, "during inlining function %s into
function %s", fndecl_name(fn), function_name(cfun));
+
Compiling gcc/testsuite/g++.dg/opt/pmf1.C triggers that warning:
gcc/testsuite/g++.dg/opt/pmf1.C: In function 'int main()':
gcc/testsuite/g++.dg/opt/pmf1.C:72:42: warning: dereferencing type-punned
pointer will break strict-aliasing rules. With expression: &t, type of
expresssion: struct Container *, type to cast: struct WorldObject * const.
[-Wstrict-aliasing]
t.forward(itemfunptr, &Item::fred, 1);
^
gcc/testsuite/g++.dg/opt/pmf1.C:72:42: warning: during inlining function void
WorldObject<Derived>::forward(memfunT, arg1T, arg2T) [with memfunT = void
(Container::*)(void (Item::*)(int), int); arg1T = void (Item::*)(int); arg2T =
int; Derived = Container] into function int main() [-Wstrict-aliasing]
It that a problem here? We try to case type Container to its base
type WorldObject, and that violating the strict aliasing? Let's take
a look at this.
--
Lin Zuojian