From: Jakub Jelinek Date: Thu, 24 Apr 2014 21:20:28 +0000 (+0200) Subject: c-parser.c (c_parser_omp_atomic): Allow seq_cst before atomic-clause... X-Git-Tag: releases/gcc-5.1.0~7937 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=42056eaced812253def2d3be64b755a998c8f830;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 2d182f354d5a..3ee2594afd69 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2014-04-24 Jakub Jelinek + + * 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 PR c/59073 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 0deab8404563..6eb235c5c431 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -11195,6 +11195,18 @@ c_parser_omp_atomic (location_t loc, c_parser *parser) bool swapped = false; bool seq_cst = false; + 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); @@ -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 ae2134265530..584046150bcf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-04-24 Jakub Jelinek + + * 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 PR libstdc++/43622 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4e6a2b88f320..c1d94ae92b52 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -28529,6 +28529,20 @@ cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok) bool structured_block = false; bool seq_cst = false; + 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, "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; @@ -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 413d6ce8615e..5813e5e66e0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-24 Jakub Jelinek + + * 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 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 87fbaa23317f..9332396eaa5d 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; } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 06f40acfe328..0b26b9fdb4a6 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,5 +1,10 @@ 2014-04-24 Jakub Jelinek + * 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. + * testsuite/libgomp.c/simd-7.c: New test. * testsuite/libgomp.c/simd-8.c: New test. * testsuite/libgomp.c/simd-9.c: New test. diff --git a/libgomp/testsuite/libgomp.c++/atomic-14.C b/libgomp/testsuite/libgomp.c++/atomic-14.C index 4cd9df812d32..dccea3acd803 100644 --- a/libgomp/testsuite/libgomp.c++/atomic-14.C +++ b/libgomp/testsuite/libgomp.c++/atomic-14.C @@ -13,13 +13,13 @@ main () v = x; if (v != 3) abort (); - #pragma omp atomic update seq_cst + #pragma omp atomic seq_cst update x = 3 * 2 * 1 + x; - #pragma omp atomic read seq_cst + #pragma omp atomic read, seq_cst v = x; if (v != 9) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst, capture v = x = x | 16; if (v != 25) abort (); @@ -27,15 +27,15 @@ main () v = x = x + 14 * 2 / 4; if (v != 32) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture v = x = 5 | x; if (v != 37) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture, seq_cst v = x = 40 + 12 - 2 - 7 - x; if (v != 6) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic seq_cst read v = x; if (v != 6) abort (); @@ -43,7 +43,7 @@ main () { v = x; x = 3 + x; } if (v != 6) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { v = x; x = -1 * -1 * -1 * -1 - x; } if (v != 9) abort (); @@ -51,11 +51,11 @@ main () v = x; if (v != -8) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture, seq_cst { x = 2 * 2 - x; v = x; } if (v != 12) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { x = 7 & x; v = x; } if (v != 4) abort (); @@ -63,7 +63,7 @@ main () { v = x; x = 6; } if (v != 4) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic read, seq_cst v = x; if (v != 6) abort (); @@ -71,11 +71,11 @@ main () { v = x; x = 7 * 8 + 23; } if (v != 6) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic seq_cst, read v = x; if (v != 79) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture , seq_cst { v = x; x = 23 + 6 * 4; } if (v != 79) abort (); @@ -83,7 +83,7 @@ main () v = x; if (v != 47) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { v = x; x = l ? 17 : 12; } if (v != 47) abort (); diff --git a/libgomp/testsuite/libgomp.c++/atomic-15.C b/libgomp/testsuite/libgomp.c++/atomic-15.C index 1eabce7dbd3e..9abefb646889 100644 --- a/libgomp/testsuite/libgomp.c++/atomic-15.C +++ b/libgomp/testsuite/libgomp.c++/atomic-15.C @@ -14,13 +14,13 @@ foo () v = x; if (v != 3) abort (); - #pragma omp atomic update seq_cst + #pragma omp atomic seq_cst update x = 3 * 2 * 1 + x; - #pragma omp atomic read seq_cst + #pragma omp atomic read, seq_cst v = x; if (v != 9) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst, capture v = x = x | 16; if (v != 25) abort (); @@ -28,15 +28,15 @@ foo () v = x = x + 14 * 2 / 4; if (v != 32) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture v = x = 5 | x; if (v != 37) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture, seq_cst v = x = 40 + 12 - 2 - 7 - x; if (v != 6) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic seq_cst read v = x; if (v != 6) abort (); @@ -44,7 +44,7 @@ foo () { v = x; x = 3 + x; } if (v != 6) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { v = x; x = -1 * -1 * -1 * -1 - x; } if (v != 9) abort (); @@ -52,11 +52,11 @@ foo () v = x; if (v != -8) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture, seq_cst { x = 2 * 2 - x; v = x; } if (v != 12) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { x = 7 & x; v = x; } if (v != 4) abort (); @@ -64,7 +64,7 @@ foo () { v = x; x = 6; } if (v != 4) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic read, seq_cst v = x; if (v != 6) abort (); @@ -72,11 +72,11 @@ foo () { v = x; x = 7 * 8 + 23; } if (v != 6) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic seq_cst, read v = x; if (v != 79) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture , seq_cst { v = x; x = 23 + 6 * 4; } if (v != 79) abort (); @@ -84,7 +84,7 @@ foo () v = x; if (v != 47) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { v = x; x = l ? 17 : 12; } if (v != 47) abort (); diff --git a/libgomp/testsuite/libgomp.c/atomic-17.c b/libgomp/testsuite/libgomp.c/atomic-17.c index 2bd0e9b44dc9..147ab26a9530 100644 --- a/libgomp/testsuite/libgomp.c/atomic-17.c +++ b/libgomp/testsuite/libgomp.c/atomic-17.c @@ -13,13 +13,13 @@ main () v = x; if (v != 3) abort (); - #pragma omp atomic update seq_cst + #pragma omp atomic seq_cst update x = 3 * 2 * 1 + x; - #pragma omp atomic read seq_cst + #pragma omp atomic read, seq_cst v = x; if (v != 9) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst, capture v = x = x | 16; if (v != 25) abort (); @@ -27,15 +27,15 @@ main () v = x = x + 14 * 2 / 4; if (v != 32) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture v = x = 5 | x; if (v != 37) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture, seq_cst v = x = 40 + 12 - 2 - 7 - x; if (v != 6) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic seq_cst read v = x; if (v != 6) abort (); @@ -43,7 +43,7 @@ main () { v = x; x = 3 + x; } if (v != 6) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { v = x; x = -1 * -1 * -1 * -1 - x; } if (v != 9) abort (); @@ -51,11 +51,11 @@ main () v = x; if (v != -8) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture, seq_cst { x = 2 * 2 - x; v = x; } if (v != 12) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { x = 7 & x; v = x; } if (v != 4) abort (); @@ -63,7 +63,7 @@ main () { v = x; x = 6; } if (v != 4) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic read, seq_cst v = x; if (v != 6) abort (); @@ -71,11 +71,11 @@ main () { v = x; x = 7 * 8 + 23; } if (v != 6) abort (); - #pragma omp atomic read seq_cst + #pragma omp atomic seq_cst, read v = x; if (v != 79) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic capture , seq_cst { v = x; x = 23 + 6 * 4; } if (v != 79) abort (); @@ -83,7 +83,7 @@ main () v = x; if (v != 47) abort (); - #pragma omp atomic capture seq_cst + #pragma omp atomic seq_cst capture { v = x; x = l ? 17 : 12; } if (v != 47) abort ();