r350634 - [OPENMP]Fix PR40191: Do not allow orphaned cancellation constructs.

Roman Lebedev via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 8 08:03:51 PST 2019


Thanks!

On Tue, Jan 8, 2019 at 6:57 PM Alexey Bataev via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: abataev
> Date: Tue Jan  8 07:53:42 2019
> New Revision: 350634
>
> URL: http://llvm.org/viewvc/llvm-project?rev=350634&view=rev
> Log:
> [OPENMP]Fix PR40191: Do not allow orphaned cancellation constructs.
>
> Prohibited use of the orphaned cancellation directives.
>
> Modified:
>     cfe/trunk/lib/Sema/SemaOpenMP.cpp
>     cfe/trunk/test/OpenMP/cancel_messages.cpp
>     cfe/trunk/test/OpenMP/cancellation_point_messages.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=350634&r1=350633&r2=350634&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Tue Jan  8 07:53:42 2019
> @@ -3094,11 +3094,13 @@ static bool checkNestingOfRegions(Sema &
>        }
>        return false;
>      }
> -    // Allow some constructs (except teams) to be orphaned (they could be
> -    // used in functions, called from OpenMP regions with the required
> -    // preconditions).
> +    // Allow some constructs (except teams and cancellation constructs) to be
> +    // orphaned (they could be used in functions, called from OpenMP regions
> +    // with the required preconditions).
>      if (ParentRegion == OMPD_unknown &&
> -        !isOpenMPNestingTeamsDirective(CurrentRegion))
> +        !isOpenMPNestingTeamsDirective(CurrentRegion) &&
> +        CurrentRegion != OMPD_cancellation_point &&
> +        CurrentRegion != OMPD_cancel)
>        return false;
>      if (CurrentRegion == OMPD_cancellation_point ||
>          CurrentRegion == OMPD_cancel) {
> @@ -3127,6 +3129,7 @@ static bool checkNestingOfRegions(Sema &
>              (CancelRegion == OMPD_sections &&
>               (ParentRegion == OMPD_section || ParentRegion == OMPD_sections ||
>                ParentRegion == OMPD_parallel_sections)));
> +      OrphanSeen = ParentRegion == OMPD_unknown;
>      } else if (CurrentRegion == OMPD_master) {
>        // OpenMP [2.16, Nesting of Regions]
>        // A master region may not be closely nested inside a worksharing,
>
> Modified: cfe/trunk/test/OpenMP/cancel_messages.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/cancel_messages.cpp?rev=350634&r1=350633&r2=350634&view=diff
> ==============================================================================
> --- cfe/trunk/test/OpenMP/cancel_messages.cpp (original)
> +++ cfe/trunk/test/OpenMP/cancel_messages.cpp Tue Jan  8 07:53:42 2019
> @@ -10,18 +10,18 @@ int main(int argc, char **argv) {
>    {
>  #pragma omp cancel // expected-error {{one of 'for', 'parallel', 'sections' or 'taskgroup' is expected}}
>    }
> -#pragma omp cancel parallel untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp cancel'}}
> +#pragma omp cancel parallel untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp cancel'}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>  #pragma omp cancel unknown         // expected-error {{one of 'for', 'parallel', 'sections' or 'taskgroup' is expected}}
>  #pragma omp parallel
>    {
>  #pragma omp cancel unknown         // expected-error {{one of 'for', 'parallel', 'sections' or 'taskgroup' is expected}}
>    }
> -#pragma omp cancel sections(       // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}}
> -#pragma omp cancel for, )          // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}}
> -#pragma omp cancel taskgroup()     // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}}
> -#pragma omp cancel parallel, if    // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}}
> +#pragma omp cancel sections(       // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
> +#pragma omp cancel for, )          // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
> +#pragma omp cancel taskgroup()     // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
> +#pragma omp cancel parallel, if    // expected-warning {{extra tokens at the end of '#pragma omp cancel' are ignored}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    if (argc)
> -#pragma omp cancel for // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}}
> +#pragma omp cancel for // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      if (argc) {
>  #pragma omp taskgroup
>  #pragma omp task
> @@ -48,44 +48,44 @@ int main(int argc, char **argv) {
>  #pragma omp cancel parallel // expected-error {{region cannot be closely nested inside 'sections' region}}
>    }
>    while (argc)
> -#pragma omp cancel for // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}}
> +#pragma omp cancel for // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      while (argc) {
> -#pragma omp cancel sections
> +#pragma omp cancel sections // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      }
>    do
> -#pragma omp cancel parallel // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}}
> +#pragma omp cancel parallel // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      while (argc)
>        ;
>    do {
> -#pragma omp cancel taskgroup
> +#pragma omp cancel taskgroup // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    } while (argc);
>    switch (argc)
> -#pragma omp cancel parallel // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}}
> +#pragma omp cancel parallel // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      switch (argc)
>      case 1:
> -#pragma omp cancel sections
> +#pragma omp cancel sections // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    switch (argc)
>    case 1: {
> -#pragma omp cancel for
> +#pragma omp cancel for // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    }
>    switch (argc) {
> -#pragma omp cancel taskgroup
> +#pragma omp cancel taskgroup // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    case 1:
> -#pragma omp cancel parallel
> +#pragma omp cancel parallel // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      break;
>    default: {
> -#pragma omp cancel sections
> +#pragma omp cancel sections // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    } break;
>    }
>    for (;;)
> -#pragma omp cancel for // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}}
> +#pragma omp cancel for // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      for (;;) {
> -#pragma omp cancel taskgroup
> +#pragma omp cancel taskgroup // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      }
>  label:
> -#pragma omp cancel parallel // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}}
> +#pragma omp cancel parallel // expected-error {{'#pragma omp cancel' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>  label1 : {
> -#pragma omp cancel sections
> +#pragma omp cancel sections // expected-error {{orphaned 'omp cancel' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>  }
>
>    return 0;
>
> Modified: cfe/trunk/test/OpenMP/cancellation_point_messages.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/cancellation_point_messages.cpp?rev=350634&r1=350633&r2=350634&view=diff
> ==============================================================================
> --- cfe/trunk/test/OpenMP/cancellation_point_messages.cpp (original)
> +++ cfe/trunk/test/OpenMP/cancellation_point_messages.cpp Tue Jan  8 07:53:42 2019
> @@ -10,18 +10,18 @@ int main(int argc, char **argv) {
>    {
>  #pragma omp cancellation point // expected-error {{one of 'for', 'parallel', 'sections' or 'taskgroup' is expected}}
>    }
> -#pragma omp cancellation point parallel untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp cancellation point'}}
> +#pragma omp cancellation point parallel untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp cancellation point'}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>  #pragma omp cancellation point unknown         // expected-error {{one of 'for', 'parallel', 'sections' or 'taskgroup' is expected}}
>  #pragma omp parallel
>    {
>  #pragma omp cancellation point unknown         // expected-error {{one of 'for', 'parallel', 'sections' or 'taskgroup' is expected}}
>    }
> -#pragma omp cancellation point sections(       // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}}
> -#pragma omp cancellation point for, )          // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}}
> -#pragma omp cancellation point taskgroup()     // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}}
> -#pragma omp cancellation point parallel, if    // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}}
> +#pragma omp cancellation point sections(       // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
> +#pragma omp cancellation point for, )          // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
> +#pragma omp cancellation point taskgroup()     // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
> +#pragma omp cancellation point parallel, if    // expected-warning {{extra tokens at the end of '#pragma omp cancellation point' are ignored}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    if (argc)
> -#pragma omp cancellation point for // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}}
> +#pragma omp cancellation point for // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      if (argc) {
>  #pragma omp taskgroup
>  #pragma omp task
> @@ -48,44 +48,44 @@ int main(int argc, char **argv) {
>  #pragma omp cancellation point parallel // expected-error {{region cannot be closely nested inside 'sections' region}}
>    }
>    while (argc)
> -#pragma omp cancellation point for // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}}
> +#pragma omp cancellation point for // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      while (argc) {
> -#pragma omp cancellation point sections
> +#pragma omp cancellation point sections // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      }
>    do
> -#pragma omp cancellation point parallel // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}}
> +#pragma omp cancellation point parallel // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      while (argc)
>        ;
>    do {
> -#pragma omp cancellation point taskgroup
> +#pragma omp cancellation point taskgroup // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    } while (argc);
>    switch (argc)
> -#pragma omp cancellation point parallel // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}}
> +#pragma omp cancellation point parallel // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      switch (argc)
>      case 1:
> -#pragma omp cancellation point sections
> +#pragma omp cancellation point sections // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    switch (argc)
>    case 1: {
> -#pragma omp cancellation point for
> +#pragma omp cancellation point for // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    }
>    switch (argc) {
> -#pragma omp cancellation point taskgroup
> +#pragma omp cancellation point taskgroup // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    case 1:
> -#pragma omp cancellation point parallel
> +#pragma omp cancellation point parallel // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      break;
>    default: {
> -#pragma omp cancellation point sections
> +#pragma omp cancellation point sections // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>    } break;
>    }
>    for (;;)
> -#pragma omp cancellation point for // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}}
> +#pragma omp cancellation point for // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      for (;;) {
> -#pragma omp cancellation point taskgroup
> +#pragma omp cancellation point taskgroup // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>      }
>  label:
> -#pragma omp cancellation point parallel // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}}
> +#pragma omp cancellation point parallel // expected-error {{'#pragma omp cancellation point' cannot be an immediate substatement}} expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>  label1 : {
> -#pragma omp cancellation point sections
> +#pragma omp cancellation point sections // expected-error {{orphaned 'omp cancellation point' directives are prohibited; perhaps you forget to enclose the directive into a region?}}
>  }
>
>    return 0;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list