From: Jakub Jelinek Date: Tue, 30 May 2017 08:04:55 +0000 (+0200) Subject: backport: re PR c++/79664 (ICE with #pragma omp parallel in constexpr function) X-Git-Tag: releases/gcc-5.5.0~263 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62ef621875d49d47c86f3be5dd5df376e8ad3032;p=thirdparty%2Fgcc.git backport: re PR c++/79664 (ICE with #pragma omp parallel in constexpr function) Backported from mainline 2017-02-22 Jakub Jelinek PR c++/79664 * parser.c (cp_parser_omp_teams, cp_parser_omp_target): Use SET_EXPR_LOCATION on OMP_TARGET/OMP_TEAMS tree. * constexpr.c (potential_constant_expression_1): Handle OMP_*, OACC_* and CILK_* trees. * g++.dg/gomp/pr79664.C: New test. From-SVN: r248650 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 28bf37995023..9775a4a0aed9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,14 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2017-02-22 Jakub Jelinek + + PR c++/79664 + * parser.c (cp_parser_omp_teams, cp_parser_omp_target): Use + SET_EXPR_LOCATION on OMP_TARGET/OMP_TEAMS tree. + * constexpr.c (potential_constant_expression_1): Handle + OMP_*, OACC_* and CILK_* trees. + 2017-02-16 Jakub Jelinek PR c++/79512 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index f7a2b9b01178..b996e98027fb 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -4555,10 +4555,37 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, case DELETE_EXPR: case VEC_DELETE_EXPR: case THROW_EXPR: + case OMP_PARALLEL: + case OMP_TASK: + case OMP_FOR: + case OMP_DISTRIBUTE: + case OMP_TEAMS: + case OMP_TARGET_DATA: + case OMP_TARGET: + case OMP_SECTIONS: + case OMP_ORDERED: + case OMP_CRITICAL: + case OMP_SINGLE: + case OMP_SECTION: + case OMP_MASTER: + case OMP_TASKGROUP: + case OMP_TARGET_UPDATE: case OMP_ATOMIC: case OMP_ATOMIC_READ: case OMP_ATOMIC_CAPTURE_OLD: case OMP_ATOMIC_CAPTURE_NEW: + case OACC_PARALLEL: + case OACC_KERNELS: + case OACC_DATA: + case OACC_HOST_DATA: + case OACC_LOOP: + case OACC_CACHE: + case OACC_DECLARE: + case OACC_ENTER_DATA: + case OACC_EXIT_DATA: + case OACC_UPDATE: + case CILK_SIMD: + case CILK_FOR: /* GCC internal stuff. */ case VA_ARG_EXPR: case OBJ_TYPE_REF: @@ -4566,7 +4593,8 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, case ASM_EXPR: fail: if (flags & tf_error) - error ("expression %qE is not a constant-expression", t); + error_at (EXPR_LOC_OR_LOC (t, input_location), + "expression %qE is not a constant-expression", t); return false; case TYPEID_EXPR: diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4239fee3a584..76868276a02e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -31400,6 +31400,7 @@ cp_parser_omp_teams (cp_parser *parser, cp_token *pragma_tok, OMP_TEAMS_CLAUSES (ret) = clauses; OMP_TEAMS_BODY (ret) = body; OMP_TEAMS_COMBINED (ret) = 1; + SET_EXPR_LOCATION (ret, loc); return add_stmt (ret); } } @@ -31421,6 +31422,7 @@ cp_parser_omp_teams (cp_parser *parser, cp_token *pragma_tok, TREE_TYPE (stmt) = void_type_node; OMP_TEAMS_CLAUSES (stmt) = clauses; OMP_TEAMS_BODY (stmt) = cp_parser_omp_structured_block (parser); + SET_EXPR_LOCATION (stmt, loc); return add_stmt (stmt); } @@ -31545,6 +31547,7 @@ cp_parser_omp_target (cp_parser *parser, cp_token *pragma_tok, TREE_TYPE (stmt) = void_type_node; OMP_TARGET_CLAUSES (stmt) = cclauses[C_OMP_CLAUSE_SPLIT_TARGET]; OMP_TARGET_BODY (stmt) = body; + SET_EXPR_LOCATION (stmt, pragma_tok->location); add_stmt (stmt); return true; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc6933e070df..910ffe162e5a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2017-02-22 Jakub Jelinek + + PR c++/79664 + * g++.dg/gomp/pr79664.C: New test. + 2017-02-21 Jakub Jelinek PR target/79570 diff --git a/gcc/testsuite/g++.dg/gomp/pr79664.C b/gcc/testsuite/g++.dg/gomp/pr79664.C new file mode 100644 index 000000000000..f796d388eb2a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr79664.C @@ -0,0 +1,142 @@ +// PR c++/79664 +// { dg-do compile } +// { dg-options "-std=c++14 -fopenmp" } + +constexpr int +f1 () +{ + int i = 0; +#pragma omp parallel for // { dg-error "is not a constant-expression" } + for (i = 0; i < 10; ++i) + ; + return 0; +} + +constexpr int +f2 () +{ + int i = 0; +#pragma omp parallel // { dg-error "is not a constant-expression" } + i = 5; + return 0; +} + +constexpr int +f3 () +{ + int i = 0; +#pragma omp task // { dg-error "is not a constant-expression" } + i = 5; + return 0; +} + +constexpr int +f4 () +{ + int i = 0; +#pragma omp for // { dg-error "is not a constant-expression" } + for (i = 0; i < 10; ++i) + ; + return 0; +} + +constexpr int +f6 () +{ + int i = 0; +#pragma omp target teams // { dg-error "is not a constant-expression" } + i = 5; + return 0; +} + +constexpr int +f7 () +{ + int i = 0; +#pragma omp target data map(tofrom:i) // { dg-error "is not a constant-expression" } + i = 5; + return 0; +} + +constexpr int +f8 () +{ + int i = 0; +#pragma omp target // { dg-error "is not a constant-expression" } + i = 5; + return 0; +} + +constexpr int +f9 () +{ + int i = 0; +#pragma omp sections // { dg-error "is not a constant-expression" } + { +#pragma omp section + i = 5; + } + return 0; +} + +constexpr int +f10 () +{ + int i = 0; +#pragma omp ordered // { dg-error "is not a constant-expression" } + i = 1; + return 0; +} + +constexpr int +f11 () +{ + int i = 0; +#pragma omp critical // { dg-error "is not a constant-expression" } + i = 1; + return 0; +} + +constexpr int +f12 () +{ + int i = 0; +#pragma omp single // { dg-error "is not a constant-expression" } + i = 1; + return 0; +} + +constexpr int +f13 () +{ + int i = 0; +#pragma omp master // { dg-error "is not a constant-expression" } + i = 1; + return 0; +} + +constexpr int +f14 () +{ + int i = 0; +#pragma omp taskgroup // { dg-error "is not a constant-expression" } + i = 1; + return 0; +} + +constexpr int +f15 () +{ + int i = 0; +#pragma omp target update to(i) // { dg-error "is not a constant-expression" } + i = 1; + return 0; +} + +constexpr int +f16 () +{ + int i = 0; +#pragma omp target update to(i) // { dg-error "is not a constant-expression" } + return 0; +}