Hi!

1) reference types in map/to/from clauses are supposed to map/copy what
those references refer to, so the reference var itself doesn't need to be
addressable.  We'll need to remap the reference variable to a new reference
that will refer to the corresponding device object.
2) the spec now allows more than one to/from clauses, and the clauses don't
need to be first, restriction is that there must be at least one to/from
clause on #pragma omp target update
3) [ expression ] syntax is now freely interchangeable with
[ expression[opt] : expression[opt] ] syntax, a[3] in the clauses is
considered array element, while a[:][3][1:8] array section, but as both
array elements and array sections are allowed at the same spots, it is
easiest to parse [ expression ] the same as [ expression : 1 ].

More tweaks to follow.

2013-06-12  Jakub Jelinek  <ja...@redhat.com>

        * semantics.c (finish_omp_clause): Don't mark references addressable.
        For OMP_CLAUSE_{TO,FROM} detect same decl appearing more than once
        in motion clauses.
        * parser.c (cp_parser_omp_var_list_no_open): Handle [ expression ]
        notation in array section specification.
        (cp_parser_omp_all_clauses): Don't require to/from clauses to be
        first.
        (cp_parser_omp_target_update): Adjust diagnostics.

--- gcc/cp/semantics.c.jj       2013-06-04 20:55:56.000000000 +0200
+++ gcc/cp/semantics.c  2013-06-12 14:46:18.251419189 +0200
@@ -4925,8 +4944,18 @@ finish_omp_clauses (tree clauses)
              remove = true;
            }
          else if (!processing_template_decl
+                  && TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE
                   && !cxx_mark_addressable (t))
            remove = true;
+         else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP)
+           break;
+         else if (bitmap_bit_p (&generic_head, DECL_UID (t)))
+           {
+             error ("%qD appears more than once in motion clauses", t);
+             remove = true;
+           }
+         else
+           bitmap_set_bit (&generic_head, DECL_UID (t));
          break;
 
        case OMP_CLAUSE_UNIFORM:
--- gcc/cp/parser.c.jj  2013-06-04 20:55:56.000000000 +0200
+++ gcc/cp/parser.c     2013-06-12 12:22:01.239604269 +0200
@@ -26330,13 +26332,19 @@ cp_parser_omp_var_list_no_open (cp_parse
                  if (!colon)
                    parser->colon_corrects_to_scope_p
                      = saved_colon_corrects_to_scope_p;
-                 /* Look for `:'.  */
-                 if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
-                   goto skip_comma;
-                 if (!cp_lexer_next_token_is (parser->lexer,
-                                              CPP_CLOSE_SQUARE))
-                   length = cp_parser_expression (parser, /*cast_p=*/false,
-                                                  NULL);
+                 if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_SQUARE))
+                   length = integer_one_node;
+                 else
+                   {
+                     /* Look for `:'.  */
+                     if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
+                       goto skip_comma;
+                     if (!cp_lexer_next_token_is (parser->lexer,
+                                                  CPP_CLOSE_SQUARE))
+                       length = cp_parser_expression (parser,
+                                                      /*cast_p=*/false,
+                                                      NULL);
+                   }
                  /* Look for the closing `]'.  */
                  if (!cp_parser_require (parser, CPP_CLOSE_SQUARE,
                                          RT_CLOSE_SQUARE))
@@ -27409,15 +27447,11 @@ cp_parser_omp_all_clauses (cp_parser *pa
          clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO,
                                            clauses);
          c_name = "to";
-         if (!first)
-           goto clause_not_first;
          break;
        case PRAGMA_OMP_CLAUSE_FROM:
          clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FROM,
                                            clauses);
          c_name = "from";
-         if (!first)
-           goto clause_not_first;
          break;
        case PRAGMA_OMP_CLAUSE_UNIFORM:
          clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_UNIFORM,
@@ -29128,7 +29167,7 @@ cp_parser_omp_target_update (cp_parser *
       && find_omp_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
     {
       error_at (pragma_tok->location,
-               "%<#pragma omp target update must contain either "
+               "%<#pragma omp target update must contain at least one "
                "%<from%> or %<to%> clauses");
       return false;
     }

        Jakub

Reply via email to