On Tue, Mar 29, 2011 at 20:18, Ralf Wildenhues <Ralf.Wildenhues@xxxxxx> wrote: > Hello Dave, > > * Dave Hart wrote on Tue, Mar 29, 2011 at 11:58:53AM CEST: >> struct in6_addr in6; >> in6 = in6addr_any; >> >> and the optimizer (quite rightly) noticed the value of in6 goes out of >> scope without being referenced again and eliminated the assignment, >> thereby eliminating all references to in6addr_any, undermining the >> intent of the test. > [...] >> We have a solution, changing the test to assign the address of >> in6addr_any to a global variable preserves the reference: > >> struct in6_addr * pin6addr_any = &in6addr_any; >> >> int main() { >> return 0; >> } > [...] > >> Is our fix the best you can imagine? > > In order to be absolutely sure that the compiler can't optimize away the > reference, I'd say you need to modify external state depending on it. > Typically, you can do that by printing its contents, or, if those aren't > well-defined (so the compiler might warn about that), its address (with > %lu and cast to unsigned long, for portability). Of course this means > the test needs to include AC_INCLUDES_DEFAULT in the test header, for > stdio.h. The latter means you can then drop including sys/types another > time. IMHO, better would to be just disable a compiler to do optimization dances around 'in6' variable (i.e. mark 'in6' as 'volatile'): volatile struct in6_addr in6; in6 = in6addr_any; -- Andrew W. Nosenko <andrew.w.nosenko@xxxxxxxxx> _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf