Thanks!
On Tue, Jan 8, 2019 at 6:57 PM Alexey Bataev via cfe-commits <cfe-commits@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits