Tighten syntax checking for OpenACC routine construct in C
authorThomas Schwinge <thomas@codesourcery.com>
Tue, 24 May 2016 14:00:39 +0000 (16:00 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Tue, 24 May 2016 14:00:39 +0000 (16:00 +0200)
gcc/c/
* c-parser.c (c_parser_oacc_routine): Tighten syntax checks.
gcc/testsuite/
* c-c++-common/goacc/routine-5.c: Add tests.
* g++.dg/goacc/routine-2.C: Remove duplicate tests.
* gfortran.dg/goacc/routine-6.f90: Add tests.

From-SVN: r236639

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/routine-5.c
gcc/testsuite/g++.dg/goacc/routine-2.C
gcc/testsuite/gfortran.dg/goacc/routine-6.f90

index 9bb5ec1dfceb9f9a385b8e0d5f9ddbf2d0fcfbd3..3d69cd5794966f6bebad08b1760f47e00b1d2d35 100644 (file)
@@ -1,3 +1,7 @@
+2016-05-24  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-parser.c (c_parser_oacc_routine): Tighten syntax checks.
+
 2016-05-24  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70434
index c2c83143c0518585b8350aa063f6c5de9a1ad16d..1bc5eed7f55cb7e5928a3583ca47def96b330cfd 100644 (file)
@@ -13983,25 +13983,24 @@ c_parser_oacc_routine (c_parser *parser, enum pragma_context context)
       c_parser_consume_token (parser);
 
       c_token *token = c_parser_peek_token (parser);
-
       if (token->type == CPP_NAME && (token->id_kind == C_ID_ID
                                      || token->id_kind == C_ID_TYPENAME))
        {
          decl = lookup_name (token->value);
          if (!decl)
-           {
-             error_at (token->location, "%qE has not been declared",
-                       token->value);
-             decl = error_mark_node;
-           }
+           error_at (token->location, "%qE has not been declared",
+                     token->value);
+         c_parser_consume_token (parser);
        }
       else
        c_parser_error (parser, "expected function name");
 
-      if (token->type != CPP_CLOSE_PAREN)
-       c_parser_consume_token (parser);
-
-      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, 0);
+      if (!decl
+         || !c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
+       {
+         c_parser_skip_to_pragma_eol (parser, false);
+         return;
+       }
     }
 
   /* Build a chain of clauses.  */
index 586202e9fa0700b1f11706d4934b3a8ed824f91a..361fbbdedbae71bd486e7a97811599c04a7fb85e 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-24  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-c++-common/goacc/routine-5.c: Add tests.
+       * g++.dg/goacc/routine-2.C: Remove duplicate tests.
+       * gfortran.dg/goacc/routine-6.f90: Add tests.
+
 2016-05-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/71253
index 2a9db90dcb97d9ee78091353d8d4723e37c13ca0..1efd154f8e6e55ed7531e1b8fb3db20b89f12ed3 100644 (file)
@@ -38,13 +38,26 @@ namespace g {}
 #pragma acc routine /* { dg-error "not followed by" "" { target c++ } } */
 using namespace g;
 
-#pragma acc routine (g) /* { dg-error "does not refer to" "" { target c++ } } */
+#pragma acc routine (g) /* { dg-error "does not refer to a function" "" { target c++ } } */
 
-#endif
+#endif /* __cplusplus */
 
-#pragma acc routine (a) /* { dg-error "does not refer to" } */
+#pragma acc routine (a) /* { dg-error "does not refer to a function" } */
   
-#pragma acc routine (c) /* { dg-error "does not refer to" } */
+#pragma acc routine (c) /* { dg-error "does not refer to a function" } */
+
+
+#pragma acc routine () vector /* { dg-error "expected (function name|unqualified-id) before .\\). token" } */
+
+#pragma acc routine (+) /* { dg-error "expected (function name|unqualified-id) before .\\+. token" } */
+
+
+extern void R1(void);
+extern void R2(void);
+#pragma acc routine (R1, R2, R3) worker /* { dg-error "expected .\\). before .,. token" } */
+#pragma acc routine (R1 R2 R3) worker /* { dg-error "expected .\\). before .R2." } */
+#pragma acc routine (R1) worker
+#pragma acc routine (R2) worker
 
 
 void Bar ();
index 2d1646647af1dba369f76b329d3f860be629d45d..ea7c9bf73939f44ef2d4bbf2f6d48d37121e8bff 100644 (file)
@@ -14,15 +14,9 @@ one()
 
 int incr (int);
 float incr (float);
-int inc;
 
 #pragma acc routine (incr) /* { dg-error "names a set of overloads" } */
 
-#pragma acc routine (increment) /* { dg-error "has not been declared" } */
-
-#pragma acc routine (inc) /* { dg-error "does not refer to a function" } */
-
-#pragma acc routine (+) /* { dg-error "expected unqualified-id before '.' token" } */
 
 int sum (int, int);
 
index 10951ee686eda7aaaf3ce511de41fd89f9c900b1..10943cff3045c1bb6421626f96e5191c9fc22631 100644 (file)
@@ -29,6 +29,13 @@ program main
   !$acc routine (subr1) ! { dg-error "invalid function name" }
   external :: subr2
   !$acc routine (subr2)
+
+  external :: R1, R2
+  !$acc routine (R1 R2 R3) ! { dg-error "Syntax error in \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), expecting .\\). after NAME" }
+  !$acc routine (R1, R2, R3) ! { dg-error "Syntax error in \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), expecting .\\). after NAME" }
+  !$acc routine (R1)
+  !$acc routine (R2)
+
   !$acc parallel
   !$acc loop
   do i = 1, n