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