// RUN: %clangxx_msan -O0 %s -o %t && %run %t %p

// PR17377: C++ module destructors get stale argument shadow.

#include <stdio.h>
#include <stdlib.h>
class A {
public:
  // This destructor get stale argument shadow left from the call to f().
  ~A() {
    if (this)
      exit(0);
  }
};

A a;

__attribute__((noinline))
void f(long x) {
}

int main(void) {
  long  x;
  long * volatile p = &x;
  // This call poisons TLS shadow for the first function argument.
  f(*p);
  return 0;
}
