From bedb7f045f3bc4ccf17f4b58f840c93acb821a3f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 14 Nov 2019 09:14:16 +0100 Subject: [PATCH] c-parser.c (c_parser_omp_context_selector): Don't require score argument to fit into shwi, just to be INTEGER_CST. * 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. * 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. * 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. From-SVN: r278204 --- gcc/c/ChangeLog | 4 ++++ gcc/c/c-parser.c | 5 ++++- gcc/cp/ChangeLog | 5 +++++ gcc/cp/parser.c | 11 ++++++++--- gcc/cp/pt.c | 14 +++++++++++++- gcc/testsuite/ChangeLog | 6 ++++++ .../c-c++-common/gomp/declare-variant-2.c | 4 ++++ .../c-c++-common/gomp/declare-variant-3.c | 2 ++ 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 b60c6482993..c19cf2fae32 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,5 +1,9 @@ 2019-11-14 Jakub Jelinek + * 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 7219fc4f982..5e30a7f1916 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 ec053f3933f..c836859a6f5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2019-11-14 Jakub Jelinek + * 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 be29a2782c1..c473e7fd92f 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 307ae6ee171..84db3f9c663 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 fa87ca7c3c7..b94cac2b50b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2019-11-14 Jakub Jelinek + * 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 949a239aa91..5554059bd60 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 d0800ff2b04..f5d7797f458 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 f72d862250a..b5da619dd03 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 void f04 (); +void f05 (); +#pragma omp declare variant (f05) match (user={condition(score(N):1)}) // { dg-error "score argument must be non-negative" } +template +void f06 (); +void f07 (); +#pragma omp declare variant (f05) match (user={condition(score(N):1)}) +template +void f08 (); void test () { f02 (); f04 (); + f06 <-1> (); + f08 <0> (); } -- 2.30.2