Home | History | Annotate | Download | only in Windows
      1 // Make sure we can throw exceptions from work items executed via
      2 // QueueUserWorkItem.
      3 //
      4 // Clang doesn't support exceptions on Windows yet, so for the time being we
      5 // build this program in two parts: the code with exceptions is built with CL,
      6 // the rest is built with Clang.  This represents the typical scenario when we
      7 // build a large project using "clang-cl -fallback -fsanitize=address".
      8 //
      9 // RUN: cl -c %s -Fo%t.obj
     10 // RUN: %clangxx_asan -o %t.exe %s %t.obj
     11 // RUN: %run %t.exe 2>&1 | FileCheck %s
     12 
     13 #include <windows.h>
     14 #include <stdio.h>
     15 
     16 void ThrowAndCatch();
     17 
     18 #if !defined(__clang__)
     19 __declspec(noinline)
     20 void Throw() {
     21   fprintf(stderr, "Throw\n");
     22 // CHECK: Throw
     23   throw 1;
     24 }
     25 
     26 void ThrowAndCatch() {
     27   int local;
     28   try {
     29     Throw();
     30   } catch(...) {
     31     fprintf(stderr, "Catch\n");
     32 // CHECK: Catch
     33   }
     34 }
     35 #else
     36 
     37 HANDLE done;
     38 
     39 DWORD CALLBACK work_item(LPVOID) {
     40   ThrowAndCatch();
     41   SetEvent(done);
     42   return 0;
     43 }
     44 
     45 int main(int argc, char **argv) {
     46   done = CreateEvent(0, false, false, "job is done");
     47   if (!done)
     48     return 1;
     49   QueueUserWorkItem(&work_item, nullptr, 0);
     50   if (WAIT_OBJECT_0 != WaitForSingleObject(done, INFINITE))
     51     return 2;
     52   fprintf(stderr, "Done!\n");
     53 // CHECK: Done!
     54 }
     55 #endif
     56