On 02/08/18 09:30, Richard Biener wrote:
--- gcc/testsuite/g++.dg/torture/pr86763.C (nonexistent) +++ gcc/testsuite/g++.dg/torture/pr86763.C (working copy) @@ -0,0 +1,36 @@ +// { dg-do run } +// { dg-additional-options "-fschedule-insns2 -fstrict-aliasing" } + +#include <cstdint> +#include <cassert> +#include <time.h> +struct ID { + uint64_t value; +}; +uint64_t value(ID id) { return id.value; } +uint64_t gen { 1000 }; +struct Msg { + uint64_t time; + ID id; +}; +struct V { + V() { } + V(Msg const & msg) : msg(msg) { } + Msg & get() { return msg; } + Msg msg; + char pad[237 - sizeof(Msg)]; +}; +struct T : V { using V::V; }; +Msg init_msg() { + Msg msg; + timespec t; + clock_gettime(CLOCK_REALTIME, &t);
this fails on targets without clock_gettime (baremetal) or targets that need -lrt at link time. can we use something else here? e.g. time(&t) works on baremetal and does not depend on -lrt.
+ msg.time = t.tv_sec + t.tv_nsec; + msg.id.value = ++gen; + return msg; +} +int main() { + T t; + t = init_msg(); + assert(value(t.get().id) == 1001); +}