aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog4
-rw-r--r--gcc/c/c-parser.c5
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c11
-rw-r--r--gcc/cp/pt.c14
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/c-c++-common/gomp/declare-variant-2.c4
-rw-r--r--gcc/testsuite/c-c++-common/gomp/declare-variant-3.c2
-rw-r--r--gcc/testsuite/g++.dg/gomp/declare-variant-8.C10
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> ();
}