diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 5 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 11 | ||||
-rw-r--r-- | gcc/cp/pt.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/declare-variant-2.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/declare-variant-3.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/declare-variant-8.C | 10 |
9 files changed, 56 insertions, 5 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index b60c648..c19cf2f 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,5 +1,9 @@ 2019-11-14 Jakub Jelinek <jakub@redhat.com> + * c-parser.c (c_parser_omp_context_selector): Don't require score + argument to fit into shwi, just to be INTEGER_CST. Diagnose + negative score. + * c-parser.c (c_parser_omp_context_selector): Rename CTX_PROPERTY_IDLIST to CTX_PROPERTY_NAME_LIST, add CTX_PROPERTY_ID. Use CTX_PROPERTY_ID for atomic_default_mem_order, only allow a single diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 7219fc4..5e30a7f 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -19823,9 +19823,12 @@ c_parser_omp_context_selector (c_parser *parser, tree set, tree parms) mark_exp_read (score); score = c_fully_fold (score, false, NULL); if (!INTEGRAL_TYPE_P (TREE_TYPE (score)) - || !tree_fits_shwi_p (score)) + || TREE_CODE (score) != INTEGER_CST) error_at (token->location, "score argument must be " "constant integer expression"); + else if (tree_int_cst_sgn (score) < 0) + error_at (token->location, "score argument must be " + "non-negative"); else properties = tree_cons (get_identifier (" score"), score, properties); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec053f3..c836859 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2019-11-14 Jakub Jelinek <jakub@redhat.com> + * parser.c (cp_parser_omp_context_selector): Don't require score + argument to fit into shwi, just to be INTEGER_CST. Diagnose + negative score. + * pt.c (tsubst_attribute): Likewise. + * parser.c (cp_parser_omp_context_selector): Rename CTX_PROPERTY_IDLIST to CTX_PROPERTY_NAME_LIST, add CTX_PROPERTY_ID. Use CTX_PROPERTY_ID for atomic_default_mem_order, only allow a single diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index be29a27..c473e7f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -40565,11 +40565,16 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p) if (score != error_mark_node) { score = fold_non_dependent_expr (score); - if (!value_dependent_expression_p (score) - && (!INTEGRAL_TYPE_P (TREE_TYPE (score)) - || !tree_fits_shwi_p (score))) + if (value_dependent_expression_p (score)) + properties = tree_cons (get_identifier (" score"), + score, properties); + else if (!INTEGRAL_TYPE_P (TREE_TYPE (score)) + || TREE_CODE (score) != INTEGER_CST) error_at (token->location, "score argument must be " "constant integer expression"); + else if (tree_int_cst_sgn (score) < 0) + error_at (token->location, "score argument must be " + "non-negative"); else properties = tree_cons (get_identifier (" score"), score, properties); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 307ae6e..84db3f9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11172,7 +11172,9 @@ tsubst_attribute (tree t, tree *decl_p, tree args, v = tsubst_expr (v, args, complain, in_decl, true); v = fold_non_dependent_expr (v); if (!INTEGRAL_TYPE_P (TREE_TYPE (v)) - || !tree_fits_shwi_p (v)) + || (TREE_PURPOSE (t3) == score + ? TREE_CODE (v) != INTEGER_CST + : !tree_fits_shwi_p (v))) { location_t loc = cp_expr_loc_or_loc (TREE_VALUE (t3), @@ -11189,6 +11191,16 @@ tsubst_attribute (tree t, tree *decl_p, tree args, "integer expression"); return NULL_TREE; } + else if (TREE_PURPOSE (t3) == score + && tree_int_cst_sgn (v) < 0) + { + location_t loc + = cp_expr_loc_or_loc (TREE_VALUE (t3), + match_loc); + error_at (loc, "score argument must be " + "non-negative"); + return NULL_TREE; + } TREE_VALUE (t3) = v; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fa87ca7..b94cac2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2019-11-14 Jakub Jelinek <jakub@redhat.com> + * c-c++-common/gomp/declare-variant-2.c: Add test for non-integral + score and for negative score. + * c-c++-common/gomp/declare-variant-3.c: Add test for zero score. + * g++.dg/gomp/declare-variant-8.C: Add test for negative and zero + scores. + * c-c++-common/gomp/declare-variant-3.c: Add testcase for vendor nvidia. * c-c++-common/gomp/declare-variant-2.c: Adjust expected diagnostics, diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c index 949a239..5554059 100644 --- a/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-2.c @@ -153,3 +153,7 @@ void f74 (void); void f75 (void); #pragma omp declare variant (f1) match(implementation={atomic_default_mem_order("relaxed")}) /* { dg-error "expected identifier before string constant" } */ void f76 (void); +#pragma omp declare variant (f1) match(user={condition(score(&f76):1)}) /* { dg-error "score argument must be constant integer expression" "" { target { ! c++98_only } } } */ +void f77 (void); /* { dg-error "cannot appear in a constant-expression" "" { target c++98_only } .-1 } */ +#pragma omp declare variant (f1) match(user={condition(score(-130):1)}) /* { dg-error "score argument must be non-negative" } */ +void f78 (void); diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c b/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c index d0800ff..f5d7797 100644 --- a/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c +++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c @@ -147,3 +147,5 @@ void f76 (void); void f77 (void); #pragma omp declare variant (f13) match (implementation={vendor(nvidia)}) void f78 (void); +#pragma omp declare variant (f13) match (user={condition(score(0):0)}) +void f79 (void); diff --git a/gcc/testsuite/g++.dg/gomp/declare-variant-8.C b/gcc/testsuite/g++.dg/gomp/declare-variant-8.C index f72d862..b5da619 100644 --- a/gcc/testsuite/g++.dg/gomp/declare-variant-8.C +++ b/gcc/testsuite/g++.dg/gomp/declare-variant-8.C @@ -9,10 +9,20 @@ void f03 (); #pragma omp declare variant (f03) match (user={condition(score((T) 1):1)}) // { dg-error "score argument must be constant integer expression" } template <typename T> void f04 (); +void f05 (); +#pragma omp declare variant (f05) match (user={condition(score(N):1)}) // { dg-error "score argument must be non-negative" } +template <int N> +void f06 (); +void f07 (); +#pragma omp declare variant (f05) match (user={condition(score(N):1)}) +template <int N> +void f08 (); void test () { f02 <double> (); f04 <float> (); + f06 <-1> (); + f08 <0> (); } |