Consider the following example source code.
struct bar; struct foo { struct foo *ffp; struct bar *fbp; } *fp; struct bar { struct bar *bbp; long b2; } *bp;
The compiler’s assumptions based on various alias levels are the following:
If this example is compiled with the -xalias_level=weak option, only fp->ffp and bp->bbp can alias each other.
If this example is compiled with the -xalias_level=layout option, only fp->ffp and bp->bbp can alias each other.
If this example is compiled with the -xalias_level=strict option, no fields can alias because the two struct types are still different even after their tags are removed.
If this example is compiled with the -xalias_level=std option, no fields can alias because the two types and the tags are not the same.