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