diff mbox

Tighten syntax checking for OpenACC routine construct in C

Message ID 878twc8wiy.fsf@kepler.schwinge.homeip.net
State New
Headers show

Commit Message

Thomas Schwinge Aug. 4, 2016, 1:59 p.m. UTC
Hi!

On Tue, 24 May 2016 16:02:39 +0200, I wrote:
> Committed without changes in r236639:
> 
> commit c9d624bd2672463771546e73bf3d6446d64e43c0
> Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
> Date:   Tue May 24 14:00:39 2016 +0000
> 
>     Tighten syntax checking for OpenACC routine construct in C

Backported to gomp-4_0-branch in r239131:

commit 7d092bfdda42f5d3baf53ab3fe7d0ac941bff872
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Thu Aug 4 13:49:36 2016 +0000

    Tighten syntax checking for OpenACC routine construct in C
    
    Backport trunk r236639:
    
    	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.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@239131 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/c/ChangeLog.gomp                          |  5 +++++
 gcc/c/c-parser.c                              | 19 +++++++++----------
 gcc/testsuite/ChangeLog.gomp                  |  7 +++++++
 gcc/testsuite/c-c++-common/goacc/routine-5.c  | 21 +++++++++++++++++----
 gcc/testsuite/g++.dg/goacc/routine-2.C        |  6 ------
 gcc/testsuite/gfortran.dg/goacc/routine-6.f90 |  7 +++++++
 6 files changed, 45 insertions(+), 20 deletions(-)



Grüße
 Thomas
diff mbox

Patch

diff --git gcc/c/ChangeLog.gomp gcc/c/ChangeLog.gomp
index 65c6bb8..4a4bb24 100644
--- gcc/c/ChangeLog.gomp
+++ gcc/c/ChangeLog.gomp
@@ -1,3 +1,8 @@ 
+2016-08-04  Thomas Schwinge  <thomas@codesourcery.com>
+
+	Backport trunk r236639:
+	* c-parser.c (c_parser_oacc_routine): Tighten syntax checks.
+
 2016-07-15  Cesar Philippidis  <cesar@codesourcery.com>
 
 	Backport from trunk:
diff --git gcc/c/c-parser.c gcc/c/c-parser.c
index 58c14ff..20b31dd 100644
--- gcc/c/c-parser.c
+++ gcc/c/c-parser.c
@@ -14170,25 +14170,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.  */
diff --git gcc/testsuite/ChangeLog.gomp gcc/testsuite/ChangeLog.gomp
index b197955..1b59ffa 100644
--- gcc/testsuite/ChangeLog.gomp
+++ gcc/testsuite/ChangeLog.gomp
@@ -1,3 +1,10 @@ 
+2016-08-04  Thomas Schwinge  <thomas@codesourcery.com>
+
+	Backport trunk r236639:
+	* 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-07-29  Chung-Lin Tang  <cltang@codesourcery.com>
 
 	PR fortran/70598
diff --git gcc/testsuite/c-c++-common/goacc/routine-5.c gcc/testsuite/c-c++-common/goacc/routine-5.c
index 2a9db90..1efd154 100644
--- gcc/testsuite/c-c++-common/goacc/routine-5.c
+++ gcc/testsuite/c-c++-common/goacc/routine-5.c
@@ -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 ();
diff --git gcc/testsuite/g++.dg/goacc/routine-2.C gcc/testsuite/g++.dg/goacc/routine-2.C
index 3a8bbdd..5207893 100644
--- gcc/testsuite/g++.dg/goacc/routine-2.C
+++ gcc/testsuite/g++.dg/goacc/routine-2.C
@@ -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);
 
diff --git gcc/testsuite/gfortran.dg/goacc/routine-6.f90 gcc/testsuite/gfortran.dg/goacc/routine-6.f90
index 10951ee..10943cf 100644
--- gcc/testsuite/gfortran.dg/goacc/routine-6.f90
+++ gcc/testsuite/gfortran.dg/goacc/routine-6.f90
@@ -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