1*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -O0 %s -o %t && %run %t %p 2d21b3d34SFangrui Song 3d21b3d34SFangrui Song // PR17377: C++ module destructors get stale argument shadow. 4d21b3d34SFangrui Song 5d21b3d34SFangrui Song #include <stdio.h> 6d21b3d34SFangrui Song #include <stdlib.h> 7d21b3d34SFangrui Song class A { 8d21b3d34SFangrui Song public: 9d21b3d34SFangrui Song // This destructor get stale argument shadow left from the call to f(). ~A()10d21b3d34SFangrui Song ~A() { 11d21b3d34SFangrui Song if (this) 12d21b3d34SFangrui Song exit(0); 13d21b3d34SFangrui Song } 14d21b3d34SFangrui Song }; 15d21b3d34SFangrui Song 16d21b3d34SFangrui Song A a; 17d21b3d34SFangrui Song 18d21b3d34SFangrui Song __attribute__((noinline)) f(long x)19d21b3d34SFangrui Songvoid f(long x) { 20d21b3d34SFangrui Song } 21d21b3d34SFangrui Song main(void)22d21b3d34SFangrui Songint main(void) { 23d21b3d34SFangrui Song long x; 24d21b3d34SFangrui Song long * volatile p = &x; 25d21b3d34SFangrui Song // This call poisons TLS shadow for the first function argument. 26d21b3d34SFangrui Song f(*p); 27d21b3d34SFangrui Song return 0; 28d21b3d34SFangrui Song } 29