int main(int argc, char **argv) { assert(argc > 1); fprintf(stderr, "Test case: %s\n", argv[1]); T t; (void)t.a; (void)t.b; (void)t.f(); (void)t.g(); (void)t.v(); (void)t.S::v(); U u; (void)u.T::a; (void)u.b; (void)u.T::f(); (void)u.g(); (void)u.v(); (void)u.T::v(); (void)((T&)u).S::v(); char Buffer[sizeof(U)] = {}; char TStorage[sizeof(T)]; switch (argv[1][1]) { case '0': p = reinterpret_cast<T*>(Buffer); break; case 'S': // Make sure p points to the memory chunk of sufficient size to prevent ASan // reports about out-of-bounds access. p = reinterpret_cast<T*>(new(TStorage) S); break; case 'T': p = new T; break; case 'U': p = new U; break; case 'V': p = reinterpret_cast<T*>(new U); break; } access_p(p, argv[1][0]); return 0; }
int main(int, char **argv) { T t; (void)t.a; (void)t.b; (void)t.f(); (void)t.g(); (void)t.v(); (void)t.S::v(); U u; (void)u.T::a; (void)u.b; (void)u.T::f(); (void)u.g(); (void)u.v(); (void)u.T::v(); (void)((T&)u).S::v(); char Buffer[sizeof(U)] = {}; switch (argv[1][1]) { case '0': p = reinterpret_cast<T*>(Buffer); break; case 'S': p = reinterpret_cast<T*>(new S); break; case 'T': p = new T; break; case 'U': p = new U; break; case 'V': p = reinterpret_cast<T*>(new U); break; } access_p(p, argv[1][0]); return 0; }