diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-04-24 23:20:28 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-04-24 23:20:28 +0200 |
commit | 42056eaced812253def2d3be64b755a998c8f830 (patch) | |
tree | eca87031145bd4f31013353e8d6e18d6304def16 /gcc | |
parent | f7468577f88cbfe33e0a5e9a2104a32f7e45c44f (diff) | |
download | gcc-42056eaced812253def2d3be64b755a998c8f830.tar.gz |
c-parser.c (c_parser_omp_atomic): Allow seq_cst before atomic-clause...
gcc/c/
* c-parser.c (c_parser_omp_atomic): Allow seq_cst before
atomic-clause, allow comma in between atomic-clause and
seq_cst.
gcc/cp/
* parser.c (cp_parser_omp_atomic): Allow seq_cst before
atomic-clause, allow comma in between atomic-clause and
seq_cst.
gcc/testsuite/
* c-c++-common/gomp/atomic-16.c: Remove all dg-error directives.
Replace load with read and store with write.
libgomp/
* testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and
atomic type clauses in any order and optional comma in between.
* testsuite/libgomp.c++/atomic-15.C: Likewise.
* testsuite/libgomp.c/atomic-17.c: Likewise.
From-SVN: r209762
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 30 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 34 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/atomic-16.c | 40 |
6 files changed, 89 insertions, 32 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 2d182f354d5..3ee2594afd6 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2014-04-24 Jakub Jelinek <jakub@redhat.com> + + * c-parser.c (c_parser_omp_atomic): Allow seq_cst before + atomic-clause, allow comma in between atomic-clause and + seq_cst. + 2014-04-22 Jakub Jelinek <jakub@redhat.com> PR c/59073 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 0deab840456..6eb235c5c43 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -11198,6 +11198,18 @@ c_parser_omp_atomic (location_t loc, c_parser *parser) if (c_parser_next_token_is (parser, CPP_NAME)) { const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); + if (!strcmp (p, "seq_cst")) + { + seq_cst = true; + c_parser_consume_token (parser); + if (c_parser_next_token_is (parser, CPP_COMMA) + && c_parser_peek_2nd_token (parser)->type == CPP_NAME) + c_parser_consume_token (parser); + } + } + if (c_parser_next_token_is (parser, CPP_NAME)) + { + const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); if (!strcmp (p, "read")) code = OMP_ATOMIC_READ; @@ -11212,13 +11224,21 @@ c_parser_omp_atomic (location_t loc, c_parser *parser) if (p) c_parser_consume_token (parser); } - if (c_parser_next_token_is (parser, CPP_NAME)) + if (!seq_cst) { - const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); - if (!strcmp (p, "seq_cst")) + if (c_parser_next_token_is (parser, CPP_COMMA) + && c_parser_peek_2nd_token (parser)->type == CPP_NAME) + c_parser_consume_token (parser); + + if (c_parser_next_token_is (parser, CPP_NAME)) { - seq_cst = true; - c_parser_consume_token (parser); + const char *p + = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); + if (!strcmp (p, "seq_cst")) + { + seq_cst = true; + c_parser_consume_token (parser); + } } } c_parser_skip_to_pragma_eol (parser); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ae213426553..584046150bc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-04-24 Jakub Jelinek <jakub@redhat.com> + + * parser.c (cp_parser_omp_atomic): Allow seq_cst before + atomic-clause, allow comma in between atomic-clause and + seq_cst. + 2014-04-24 Marc Glisse <marc.glisse@inria.fr> PR libstdc++/43622 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4e6a2b88f32..c1d94ae92b5 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -28534,6 +28534,20 @@ cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok) tree id = cp_lexer_peek_token (parser->lexer)->u.value; const char *p = IDENTIFIER_POINTER (id); + if (!strcmp (p, "seq_cst")) + { + seq_cst = true; + cp_lexer_consume_token (parser->lexer); + if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA) + && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME) + cp_lexer_consume_token (parser->lexer); + } + } + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) + { + tree id = cp_lexer_peek_token (parser->lexer)->u.value; + const char *p = IDENTIFIER_POINTER (id); + if (!strcmp (p, "read")) code = OMP_ATOMIC_READ; else if (!strcmp (p, "write")) @@ -28547,16 +28561,22 @@ cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok) if (p) cp_lexer_consume_token (parser->lexer); } - - if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) + if (!seq_cst) { - tree id = cp_lexer_peek_token (parser->lexer)->u.value; - const char *p = IDENTIFIER_POINTER (id); + if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA) + && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME) + cp_lexer_consume_token (parser->lexer); - if (!strcmp (p, "seq_cst")) + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) { - seq_cst = true; - cp_lexer_consume_token (parser->lexer); + tree id = cp_lexer_peek_token (parser->lexer)->u.value; + const char *p = IDENTIFIER_POINTER (id); + + if (!strcmp (p, "seq_cst")) + { + seq_cst = true; + cp_lexer_consume_token (parser->lexer); + } } } cp_parser_require_pragma_eol (parser, pragma_tok); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 413d6ce8615..5813e5e66e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-24 Jakub Jelinek <jakub@redhat.com> + + * c-c++-common/gomp/atomic-16.c: Remove all dg-error directives. + Replace load with read and store with write. + 2014-04-24 Jeff Law <law@redhat.com> PR target/60822 diff --git a/gcc/testsuite/c-c++-common/gomp/atomic-16.c b/gcc/testsuite/c-c++-common/gomp/atomic-16.c index 87fbaa23317..9332396eaa5 100644 --- a/gcc/testsuite/c-c++-common/gomp/atomic-16.c +++ b/gcc/testsuite/c-c++-common/gomp/atomic-16.c @@ -7,28 +7,28 @@ void foo () { int v; - #pragma omp atomic seq_cst load /* { dg-error "expected end of line" } */ - v = x; /* { dg-error "invalid form" } */ - #pragma omp atomic seq_cst, load /* { dg-error "expected end of line" } */ - v = x; /* { dg-error "invalid form" } */ - #pragma omp atomic seq_cst store /* { dg-error "expected end of line" } */ - x = v; /* { dg-error "invalid form" } */ - #pragma omp atomic seq_cst ,store /* { dg-error "expected end of line" } */ - x = v; /* { dg-error "invalid form" } */ - #pragma omp atomic seq_cst update /* { dg-error "expected end of line" } */ + #pragma omp atomic seq_cst read + v = x; + #pragma omp atomic seq_cst, read + v = x; + #pragma omp atomic seq_cst write + x = v; + #pragma omp atomic seq_cst ,write + x = v; + #pragma omp atomic seq_cst update x += v; - #pragma omp atomic seq_cst , update /* { dg-error "expected end of line" } */ + #pragma omp atomic seq_cst , update x += v; - #pragma omp atomic seq_cst capture /* { dg-error "expected end of line" } */ - v = x += 2; /* { dg-error "invalid form" } */ - #pragma omp atomic seq_cst, capture /* { dg-error "expected end of line" } */ - v = x += 2; /* { dg-error "invalid form" } */ - #pragma omp atomic load , seq_cst /* { dg-error "expected end of line" } */ - v = x; /* { dg-error "invalid form" } */ - #pragma omp atomic store ,seq_cst /* { dg-error "expected end of line" } */ - x = v; /* { dg-error "invalid form" } */ - #pragma omp atomic update, seq_cst /* { dg-error "expected end of line" } */ + #pragma omp atomic seq_cst capture + v = x += 2; + #pragma omp atomic seq_cst, capture + v = x += 2; + #pragma omp atomic read , seq_cst + v = x; + #pragma omp atomic write ,seq_cst + x = v; + #pragma omp atomic update, seq_cst x += v; - #pragma omp atomic capture, seq_cst /* { dg-error "expected end of line" } */ + #pragma omp atomic capture, seq_cst v = x += 2; } |