brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 7cdaa1f Raw
64 lines · c
1// RUN: %libomp-compile && env OMP_CANCELLATION=true %libomp-run2// Clang had a bug until version 4.0.1 which resulted in a hang.3// UNSUPPORTED: clang-3, clang-4.0.04 5// Regression test for a bug in cancellation to cover effect of `#pragma omp cancel`6// in a loop construct, on sections construct.7// Pass condition: Cancellation status from `for` does not persist8// to `sections`.9 10#include <stdio.h>11#include <omp.h>12 13int result[2] = {0, 0};14 15void cq416850_for_sections() {16 17    unsigned i;18     // 1) loop19    #pragma omp for20    for (i = 0; i < 1; i++) {21        result[0] = 1;22        #pragma omp cancel for23        result[0] = 2;24    }25 26//        printf("thread %d: result[0] = %d, result[1] = %d \n",  omp_get_thread_num(), result[0], result[1]);27 28 29    // 2) sections30    #pragma omp sections31    {32        #pragma omp section33        {34            result[1] = 1;35            #pragma omp cancellation point sections36            result[1] = 2;37        }38    }39}40 41int main(void) {42    if(!omp_get_cancellation()) {43        printf("Cancellation not enabled!\n");44        return 2;45    }46 47    #pragma omp parallel num_threads(4)48    {49        cq416850_for_sections();50    }51 52    if (result[0] != 1 || result[1] != 2) {53        printf("Incorrect values. "54               "result[0] = %d (expected 1), "55               "result[1] = %d (expected 2).\n",56               result[0], result[1]);57        printf("FAILED\n");58        return 1;59    }60 61    printf("PASSED\n");62    return 0;63}64