[COMPILER_APITEST] Add SEH tests from MS (#2435)
[reactos.git] / modules / rostests / apitests / compiler / ms / seh / seh0027.c
diff --git a/modules/rostests/apitests/compiler/ms/seh/seh0027.c b/modules/rostests/apitests/compiler/ms/seh/seh0027.c
new file mode 100644 (file)
index 0000000..26e7983
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for
+// full license information.
+
+#include <windows.h>
+#include "seh.h"
+
+char test[] = "SEH0027.c";
+int perfect;
+
+void rtlRaiseStatus(DWORD Status) {
+  RaiseException(Status, 0, /*no flags*/ 0, 0);
+  return;
+}
+
+ULONG except3(PEXCEPTION_POINTERS ExceptionPointers, PLONG Counter) {
+  PEXCEPTION_RECORD ExceptionRecord;
+
+  ExceptionRecord = ExceptionPointers->ExceptionRecord;
+  if ((ExceptionRecord->ExceptionCode == (STATUS_INTEGER_OVERFLOW)) &&
+      ((ExceptionRecord->ExceptionFlags & 0x10) == 0)) {
+    /* set counter = 23 */
+    *Counter += 17;
+    rtlRaiseStatus(EXCEPTION_EXECUTE_HANDLER);
+  } else if ((ExceptionRecord->ExceptionCode == EXCEPTION_EXECUTE_HANDLER) &&
+             ((ExceptionRecord->ExceptionFlags & 0x10) != 0)) {
+    /* set counter = 42 */
+    *Counter += 19;
+    /* return COTINUE SEARCH */
+    return 0;
+  }
+  /* never gets here due to exception being rasied */
+  *Counter += 23;
+  return 1;
+}
+
+void except1(PLONG Counter) {
+  try {
+    /* set counter = 6 */
+    *Counter += 5;
+    RaiseException(EXCEPTION_INT_OVERFLOW, 0, /*no flags*/ 0, 0);
+  }
+  except(except3(GetExceptionInformation(), Counter)) { *Counter += 7; }
+  endtry
+  /* set counter = 59 */
+  *Counter += 9;
+  return;
+}
+
+ULONG except2(PEXCEPTION_POINTERS ExceptionPointers, PLONG Counter) {
+  PEXCEPTION_RECORD ExceptionRecord;
+
+  ExceptionRecord = ExceptionPointers->ExceptionRecord;
+  if ((ExceptionRecord->ExceptionCode == EXCEPTION_EXECUTE_HANDLER) &&
+      ((ExceptionRecord->ExceptionFlags & 0x10) == 0)) {
+    /* set counter = 53 */
+    *Counter += 11;
+    return 1;
+  } else {
+    *Counter += 13;
+    return 0;
+  }
+}
+
+int main() {
+  LONG Counter;
+
+  Counter = 0;
+
+  try {
+    try {
+      /* set counter = 1 */
+      Counter += 1;
+      except1(&Counter);
+    }
+    except(except2(GetExceptionInformation(), &Counter)) {
+      /* set counter = 55 */
+      Counter += 2;
+    }
+    endtry
+  }
+  except(1) { Counter += 3; }
+  endtry
+
+  if (Counter != 55) {
+    printf("TEST 27 FAILED. Counter = %d\n\r", Counter);
+    return -1;
+  }
+
+  return 0;
+}