1*673dc3d4SNico Weber // Test for the following situation:
2*673dc3d4SNico Weber // (1) global A is constructed.
3*673dc3d4SNico Weber // (2) exit() is called during construction of global B.
4*673dc3d4SNico Weber // (3) destructor of A reads uninitialized global C from another module.
5*673dc3d4SNico Weber // We do *not* want to report init-order bug in this case.
6*673dc3d4SNico Weber 
7*673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s %p/Helpers/init-order-atexit-extra.cpp -o %t
8*673dc3d4SNico Weber // RUN: %env_asan_opts=strict_init_order=true not %run %t 2>&1 | FileCheck %s
9*673dc3d4SNico Weber 
10*673dc3d4SNico Weber #include <stdio.h>
11*673dc3d4SNico Weber #include <stdlib.h>
12*673dc3d4SNico Weber 
13*673dc3d4SNico Weber void AccessC();
14*673dc3d4SNico Weber 
15*673dc3d4SNico Weber class A {
16*673dc3d4SNico Weber  public:
A()17*673dc3d4SNico Weber   A() { }
~A()18*673dc3d4SNico Weber   ~A() { AccessC(); printf("PASSED\n"); }
19*673dc3d4SNico Weber   // CHECK-NOT: AddressSanitizer
20*673dc3d4SNico Weber   // CHECK: PASSED
21*673dc3d4SNico Weber };
22*673dc3d4SNico Weber 
23*673dc3d4SNico Weber A a;
24*673dc3d4SNico Weber 
25*673dc3d4SNico Weber class B {
26*673dc3d4SNico Weber  public:
B()27*673dc3d4SNico Weber   B() { exit(1); }
~B()28*673dc3d4SNico Weber   ~B() { }
29*673dc3d4SNico Weber };
30*673dc3d4SNico Weber 
31*673dc3d4SNico Weber B b;
32