--- gcc/gimplify.c.jj	2015-10-12 13:43:30.000000000 +0200
+++ gcc/gimplify.c	2015-10-12 19:19:34.563575391 +0200
@@ -6340,6 +6340,36 @@ gimplify_scan_omp_clauses (tree *list_p,
 	    }
 	  else
 	    {
+	      if (code == OMP_SIMD
+		  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
+		{
+		  struct gimplify_omp_ctx *octx = outer_ctx;
+		  if (octx
+		      && octx->region_type == ORT_WORKSHARE
+		      && octx->combined_loop
+		      && !octx->distribute)
+		    {
+		      if (octx->outer_context
+			  && (octx->outer_context->region_type
+			      == ORT_COMBINED_PARALLEL))
+			octx = octx->outer_context->outer_context;
+		      else
+			octx = octx->outer_context;
+		    }
+		  if (octx
+		      && octx->region_type == ORT_WORKSHARE
+		      && octx->combined_loop
+		      && octx->distribute
+		      && !lang_GNU_Fortran ())
+		    {
+		      error_at (OMP_CLAUSE_LOCATION (c),
+				"%<linear%> clause for variable other than "
+				"loop iterator specified on construct "
+				"combined with %<distribute%>");
+		      remove = true;
+		      break;
+		    }
+		}
 	      /* For combined #pragma omp parallel for simd, need to put
 		 lastprivate and perhaps firstprivate too on the
 		 parallel.  Similarly for #pragma omp for simd.  */
--- gcc/c/c-parser.c.jj	2015-10-12 13:26:52.000000000 +0200
+++ gcc/c/c-parser.c	2015-10-12 18:27:03.321992027 +0200
@@ -13662,6 +13662,19 @@ c_parser_omp_for_loop (location_t loc, c
 	= build_int_cst (NULL_TREE, collapse);
       ordered = collapse;
     }
+  if (ordered)
+    {
+      for (tree *pc = &clauses; *pc; )
+	if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_LINEAR)
+	  {
+	    error_at (OMP_CLAUSE_LOCATION (*pc),
+		      "%<linear%> clause may not be specified together "
+		      "with %<ordered%> clause with a parameter");
+	    *pc = OMP_CLAUSE_CHAIN (*pc);
+	  }
+	else
+	  pc = &OMP_CLAUSE_CHAIN (*pc);
+    }
 
   gcc_assert (collapse >= 1 && ordered >= 0);
   count = ordered ? ordered : collapse;
@@ -14066,6 +14079,9 @@ c_parser_omp_for (location_t loc, c_pars
   mask |= OMP_FOR_CLAUSE_MASK;
   if (cclauses)
     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
+  /* Composite distribute parallel for{, simd} disallows ordered clause.  */
+  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
+    mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED);
 
   if (c_parser_next_token_is (parser, CPP_NAME))
     {
@@ -14100,6 +14116,10 @@ c_parser_omp_for (location_t loc, c_pars
       return NULL_TREE;
     }
 
+  /* Composite distribute parallel for disallows linear clause.  */
+  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
+    mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR);
+
   clauses = c_parser_omp_all_clauses (parser, mask, p_name, cclauses == NULL);
   if (cclauses)
     {
@@ -14340,6 +14360,10 @@ c_parser_omp_parallel (location_t loc, c
 
   strcat (p_name, " parallel");
   mask |= OMP_PARALLEL_CLAUSE_MASK;
+  /* #pragma omp target parallel{, for, for simd} disallow copyin clause.  */
+  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) != 0
+      && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) == 0)
+    mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN);
 
   if (c_parser_next_token_is_keyword (parser, RID_FOR))
     {
--- gcc/cp/parser.c.jj	2015-10-12 13:27:43.000000000 +0200
+++ gcc/cp/parser.c	2015-10-12 18:44:31.150225238 +0200
@@ -32228,6 +32228,19 @@ cp_parser_omp_for_loop (cp_parser *parse
 	= build_int_cst (NULL_TREE, collapse);
       ordered = collapse;
     }
+  if (ordered)
+    {
+      for (tree *pc = &clauses; *pc; )
+	if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_LINEAR)
+	  {
+	    error_at (OMP_CLAUSE_LOCATION (*pc),
+		      "%<linear%> clause may not be specified together "
+		      "with %<ordered%> clause with a parameter");
+	    *pc = OMP_CLAUSE_CHAIN (*pc);
+	  }
+	else
+	  pc = &OMP_CLAUSE_CHAIN (*pc);
+    }
 
   gcc_assert (collapse >= 1 && ordered >= 0);
   count = ordered ? ordered : collapse;
@@ -32587,6 +32600,9 @@ cp_parser_omp_for (cp_parser *parser, cp
   mask |= OMP_FOR_CLAUSE_MASK;
   if (cclauses)
     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
+  /* Composite distribute parallel for{, simd} disallows ordered clause.  */
+  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
+    mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED);
 
   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
     {
@@ -32626,6 +32642,10 @@ cp_parser_omp_for (cp_parser *parser, cp
       return NULL_TREE;
     }
 
+  /* Composite distribute parallel for disallows linear clause.  */
+  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
+    mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR);
+
   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
 				       cclauses == NULL);
   if (cclauses)
@@ -32852,6 +32872,10 @@ cp_parser_omp_parallel (cp_parser *parse
 
   strcat (p_name, " parallel");
   mask |= OMP_PARALLEL_CLAUSE_MASK;
+  /* #pragma omp target parallel{, for, for simd} disallow copyin clause.  */
+  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) != 0
+      && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) == 0)
+    mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN);
 
   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
     {
--- gcc/testsuite/c-c++-common/gomp/clauses-1.c.jj	2015-07-16 18:09:25.000000000 +0200
+++ gcc/testsuite/c-c++-common/gomp/clauses-1.c	2015-10-12 17:47:00.355155717 +0200
@@ -15,19 +15,19 @@ foo (int d, int m, int i1, int i2, int p
   #pragma omp distribute parallel for \
     private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) ordered schedule(static, 4)
+    lastprivate (l) schedule(static, 4)
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp distribute parallel for simd \
     private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) default(shared) shared(s) reduction(+:r) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) schedule(static, 4) \
+    lastprivate (l) schedule(static, 4) \
     safelen(8) simdlen(4) aligned(q: 32)
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp distribute simd \
     private (p) firstprivate (f) collapse(1) dist_schedule(static, 16) \
-    safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32) reduction(+:r)
+    safelen(8) simdlen(4) aligned(q: 32) reduction(+:r)
   for (int i = 0; i < 64; i++)
     ll++;
 }
@@ -94,7 +94,7 @@ bar (int d, int m, int i1, int i2, int p
     shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) ordered schedule(static, 4)
+    lastprivate (l) schedule(static, 4)
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target teams distribute parallel for simd \
@@ -102,7 +102,7 @@ bar (int d, int m, int i1, int i2, int p
     shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) schedule(static, 4) \
+    lastprivate (l) schedule(static, 4) \
     safelen(8) simdlen(4) aligned(q: 32)
   for (int i = 0; i < 64; i++)
     ll++;
@@ -110,7 +110,7 @@ bar (int d, int m, int i1, int i2, int p
     device(d) map (tofrom: m) if (target: i1) private (p) firstprivate (f) defaultmap(tofrom: scalar) is_device_ptr (idp) \
     shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
-    safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32)
+    safelen(8) simdlen(4) aligned(q: 32)
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target simd \
@@ -140,7 +140,7 @@ bar (int d, int m, int i1, int i2, int p
     private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) ordered schedule(static, 4)
+    lastprivate (l) schedule(static, 4)
   for (int i = 0; i < 64; i++)
     ll++;
   #pragma omp target
@@ -148,7 +148,7 @@ bar (int d, int m, int i1, int i2, int p
     private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
     if (parallel: i2) num_threads (nth) proc_bind(spread) \
-    lastprivate (l) linear (ll:1) schedule(static, 4) \
+    lastprivate (l) schedule(static, 4) \
     safelen(8) simdlen(4) aligned(q: 32)
   for (int i = 0; i < 64; i++)
     ll++;
@@ -156,7 +156,7 @@ bar (int d, int m, int i1, int i2, int p
   #pragma omp teams distribute simd \
     private(p) firstprivate (f) shared(s) default(shared) reduction(+:r) num_teams(nte) thread_limit(tl) \
     collapse(1) dist_schedule(static, 16) \
-    safelen(8) simdlen(4) linear(ll: 1) aligned(q: 32)
+    safelen(8) simdlen(4) aligned(q: 32)
   for (int i = 0; i < 64; i++)
     ll++;
 }
--- gcc/testsuite/c-c++-common/gomp/clauses-4.c.jj	2015-10-12 17:26:00.475096064 +0200
+++ gcc/testsuite/c-c++-common/gomp/clauses-4.c	2015-10-12 18:40:14.763083015 +0200
@@ -0,0 +1,96 @@
+int t;
+#pragma omp threadprivate (t)
+
+void
+foo (int y, short z)
+{
+  int x;
+  #pragma omp target teams map (from: x)
+  #pragma omp distribute simd linear (x : 2)
+  for (x = 0; x < 64; x += 2)
+    ;
+  #pragma omp target teams map (from: x)
+  #pragma omp distribute parallel for simd linear (x)
+  for (x = 0; x < 64; x++)
+    ;
+  #pragma omp target teams map (tofrom: y)
+  #pragma omp distribute simd linear (y : 2)	/* { dg-error ".linear. clause for variable other than loop iterator specified on construct combined with .distribute." } */
+  for (x = 0; x < 64; x += 2)
+    y += 2;
+  #pragma omp target teams map (tofrom: z)
+  #pragma omp distribute parallel for simd linear (z)	/* { dg-error ".linear. clause for variable other than loop iterator specified on construct combined with .distribute." } */
+  for (x = 0; x < 64; x++)
+    z++;
+  #pragma omp target teams map (tofrom: z)
+  #pragma omp distribute parallel for linear (z: 4)	/* { dg-error ".linear. is not valid for .#pragma omp distribute parallel for." } */
+  for (x = 0; x < 64; x++)
+    z += 4;
+  #pragma omp target map (from: x)
+  #pragma omp teams distribute simd linear (x : 2)
+  for (x = 0; x < 64; x += 2)
+    ;
+  #pragma omp target map (from: x)
+  #pragma omp teams distribute parallel for simd linear (x)
+  for (x = 0; x < 64; x++)
+    ;
+  #pragma omp target map (tofrom: y)
+  #pragma omp teams distribute simd linear (y : 2)	/* { dg-error ".linear. clause for variable other than loop iterator specified on construct combined with .distribute." } */
+  for (x = 0; x < 64; x += 2)
+    y += 2;
+  #pragma omp target map (tofrom: z)
+  #pragma omp teams distribute parallel for simd linear (z)	/* { dg-error ".linear. clause for variable other than loop iterator specified on construct combined with .distribute." } */
+  for (x = 0; x < 64; x++)
+    z++;
+  #pragma omp target map (tofrom: z)
+  #pragma omp teams distribute parallel for linear (z: 4)	/* { dg-error ".linear. is not valid for .#pragma omp teams distribute parallel for." } */
+  for (x = 0; x < 64; x++)
+    z += 4;
+  #pragma omp target parallel copyin (t)	/* { dg-error ".copyin. is not valid for .#pragma omp target parallel." } */
+    ;
+  #pragma omp target parallel for copyin (t)	/* { dg-error ".copyin. is not valid for .#pragma omp target parallel for." } */
+  for (x = 0; x < 64; x++)
+    ;
+  #pragma omp target parallel for simd copyin (t)	/* { dg-error ".copyin. is not valid for .#pragma omp target parallel for simd." } */
+  for (x = 0; x < 64; x++)
+    ;
+  #pragma omp target teams
+  #pragma omp distribute parallel for ordered		/* { dg-error ".ordered. is not valid for .#pragma omp distribute parallel for." } */
+  for (x = 0; x < 64; x++)
+    {
+      #pragma omp ordered	/* { dg-error "ordered region must be closely nested inside a loop region with an ordered clause" } */
+      ;
+    }
+  #pragma omp target teams
+  #pragma omp distribute parallel for simd ordered	/* { dg-error ".ordered. is not valid for .#pragma omp distribute parallel for simd." } */
+  for (x = 0; x < 64; x++)
+    {
+      #pragma omp ordered simd, threads	/* { dg-error "OpenMP constructs other than .#pragma omp ordered simd. may not be nested inside simd region" } */
+      ;
+    }
+  #pragma omp target
+  #pragma omp teams distribute parallel for ordered		/* { dg-error ".ordered. is not valid for .#pragma omp teams distribute parallel for." } */
+  for (x = 0; x < 64; x++)
+    {
+      #pragma omp ordered	/* { dg-error "ordered region must be closely nested inside a loop region with an ordered clause" } */
+      ;
+    }
+  #pragma omp target
+  #pragma omp teams distribute parallel for simd ordered	/* { dg-error ".ordered. is not valid for .#pragma omp teams distribute parallel for simd." } */
+  for (x = 0; x < 64; x++)
+    {
+      #pragma omp ordered simd, threads	/* { dg-error "OpenMP constructs other than .#pragma omp ordered simd. may not be nested inside simd region" } */
+      ;
+    }
+  #pragma omp target teams distribute parallel for ordered		/* { dg-error ".ordered. is not valid for .#pragma omp target teams distribute parallel for." } */
+  for (x = 0; x < 64; x++)
+    {
+      #pragma omp ordered	/* { dg-error "ordered region must be closely nested inside a loop region with an ordered clause" } */
+      ;
+    }
+  #pragma omp target teams distribute parallel for simd ordered	/* { dg-error ".ordered. is not valid for .#pragma omp target teams distribute parallel for simd." } */
+  for (x = 0; x < 64; x++)
+    {
+      #pragma omp ordered simd, threads	/* { dg-error "OpenMP constructs other than .#pragma omp ordered simd. may not be nested inside simd region" } */
+      ;
+    }
+}
--- gcc/testsuite/c-c++-common/gomp/pr61486-1.c.jj	2015-04-24 12:32:01.000000000 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr61486-1.c	2015-10-12 17:49:42.041721972 +0200
@@ -6,8 +6,8 @@ int
 foo (int *a)
 {
   int i, j = 0;
-  #pragma omp target teams distribute simd linear(i, j) map(a[:10])
+  #pragma omp target teams distribute simd linear(i) map(a[:10])
   for (i = 0; i < 10; i++)
-    a[i] = j++;
-  return i + j;
+    a[i] = j;
+  return i;
 }
--- gcc/testsuite/c-c++-common/gomp/pr61486-2.c.jj	2015-09-03 16:37:51.000000000 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr61486-2.c	2015-10-12 17:55:47.205225446 +0200
@@ -50,22 +50,21 @@ test (int n, int o, int p, int q, int r,
     	private (p) firstprivate (q) shared (n) reduction (+: r) \
     	thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
     	num_threads (n + 4) proc_bind (spread) lastprivate (s) \
-    	ordered schedule (static, 8)
+    	schedule (static, 8)
       for (i = 0; i < 10; i++)
 	for (j = 0; j < 10; j++)
 	  {
 	    r = r + 1;
 	    p = q;
 	    dosomething (a, n, p + q);
-	    #pragma omp ordered
-	      p = q;
+	    p = q;
 	    s = i * 10 + j;
 	  }
     #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \
     	if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
     	private (p) firstprivate (q) shared (n) reduction (+: r) \
     	thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \
-    	proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+    	proc_bind (master) lastprivate (s) schedule (static, 8)
       for (i = 0; i < 10; i++)
 	{
 	  for (j = 0; j < 10; j++)
@@ -74,8 +73,7 @@ test (int n, int o, int p, int q, int r,
 	      p = q;
 	      dosomething (a, n, p + q);
 	    }
-	  #pragma omp ordered
-	    p = q;
+	  p = q;
 	  s = i * 10;
 	}
     #pragma omp target teams distribute parallel for simd device (n + 1) \
@@ -165,22 +163,21 @@ test (int n, int o, int p, int q, int r,
 	default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
     	thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
     	num_threads (n + 4) proc_bind (spread) lastprivate (s) \
-    	ordered schedule (static, 8)
+    	schedule (static, 8)
       for (i = 0; i < 10; i++)
 	for (j = 0; j < 10; j++)
 	  {
 	    r = r + 1;
 	    p = q;
 	    dosomething (a, n, p + q);
-	    #pragma omp ordered
-	      p = q;
+	    p = q;
 	    s = i * 10 + j;
 	  }
     #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
     #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \
 	default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
     	thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \
-    	proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+    	proc_bind (master) lastprivate (s) schedule (static, 8)
       for (i = 0; i < 10; i++)
 	{
 	  for (j = 0; j < 10; j++)
@@ -189,8 +186,7 @@ test (int n, int o, int p, int q, int r,
 	      p = q;
 	      dosomething (a, n, p + q);
 	    }
-	  #pragma omp ordered
-	    p = q;
+	  p = q;
 	  s = i * 10;
 	}
     #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
@@ -273,15 +269,14 @@ test (int n, int o, int p, int q, int r,
 	default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
     	collapse (2) dist_schedule (static, 4) \
     	num_threads (n + 4) proc_bind (spread) lastprivate (s) \
-    	ordered schedule (static, 8)
+    	schedule (static, 8)
       for (i = 0; i < 10; i++)
 	for (j = 0; j < 10; j++)
 	  {
 	    r = r + 1;
 	    p = q;
 	    dosomething (a, n, p + q);
-	    #pragma omp ordered
-	      p = q;
+	    p = q;
 	    s = i * 10 + j;
 	  }
     #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
@@ -289,7 +284,7 @@ test (int n, int o, int p, int q, int r,
     #pragma omp distribute parallel for if (n != 6) \
 	default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
     	num_threads (n + 4) dist_schedule (static, 4) \
-    	proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+    	proc_bind (master) lastprivate (s) schedule (static, 8)
       for (i = 0; i < 10; i++)
 	{
 	  for (j = 0; j < 10; j++)
@@ -298,8 +293,7 @@ test (int n, int o, int p, int q, int r,
 	      p = q;
 	      dosomething (a, n, p + q);
 	    }
-	  #pragma omp ordered
-	    p = q;
+	  p = q;
 	  s = i * 10;
 	}
     #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
@@ -385,21 +379,20 @@ test2 (int n, int o, int p, int r, int s
 	default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
     	collapse (2) dist_schedule (static, 4) \
     	num_threads (n + 4) proc_bind (spread) lastprivate (s) \
-    	ordered schedule (static, 8)
+    	schedule (static, 8)
       for (i = 0; i < 10; i++)
 	for (j = 0; j < 10; j++)
 	  {
 	    r = r + 1;
 	    p = q;
 	    dosomething (a, n, p + q);
-	    #pragma omp ordered
-	      p = q;
+	    p = q;
 	    s = i * 10 + j;
 	  }
     #pragma omp distribute parallel for if (n != 6) \
 	default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
     	num_threads (n + 4) dist_schedule (static, 4) \
-    	proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+    	proc_bind (master) lastprivate (s) schedule (static, 8)
       for (i = 0; i < 10; i++)
 	{
 	  for (j = 0; j < 10; j++)
@@ -408,8 +401,7 @@ test2 (int n, int o, int p, int r, int s
 	      p = q;
 	      dosomething (a, n, p + q);
 	    }
-	  #pragma omp ordered
-	    p = q;
+	  p = q;
 	  s = i * 10;
 	}
     #pragma omp distribute parallel for simd if (n != 6)default(shared) \
--- libgomp/testsuite/libgomp.c/pr66199-2.c.jj	2015-06-17 21:00:37.000000000 +0200
+++ libgomp/testsuite/libgomp.c/pr66199-2.c	2015-10-12 19:16:16.276558954 +0200
@@ -18,12 +18,11 @@ __attribute__((noinline, noclone)) void
 f2 (long a, long b, long c)
 {
   long d, e;
-  #pragma omp target teams distribute parallel for simd default(none) firstprivate (a, b) shared(u, v, w) linear(d) linear(c:5) lastprivate(e)
+  #pragma omp target teams distribute parallel for simd default(none) firstprivate (a, b, c) shared(u, v, w) linear(d) lastprivate(e)
   for (d = a; d < b; d++)
     {
       u[d] = v[d] + w[d];
-      c += 5;
-      e = c;
+      e = c + d * 5;
     }
 }
 
--- libgomp/testsuite/libgomp.c/pr66199-4.c.jj	2015-06-18 15:16:18.000000000 +0200
+++ libgomp/testsuite/libgomp.c/pr66199-4.c	2015-10-12 19:16:40.353196680 +0200
@@ -19,12 +19,11 @@ __attribute__((noinline, noclone)) void
 f2 (long a, long b, long c)
 {
   long d, e;
-  #pragma omp target teams distribute parallel for default(none) firstprivate (a, b) shared(u, v, w) linear(d) linear(c:5) lastprivate(e)
+  #pragma omp target teams distribute parallel for default(none) firstprivate (a, b, c) shared(u, v, w) lastprivate(d, e)
   for (d = a; d < b; d++)
     {
       u[d] = v[d] + w[d];
-      c += 5;
-      e = c;
+      e = c + d * 5;
     }
 }
 
--- libgomp/testsuite/libgomp.c/linear-2.c.jj	2015-07-17 15:23:45.000000000 +0200
+++ libgomp/testsuite/libgomp.c/linear-2.c	2015-10-12 19:10:36.912665256 +0200
@@ -1,244 +0,0 @@
-#pragma omp declare target
-int a[256];
-#pragma omp end declare target
-
-__attribute__((noinline, noclone)) void
-f1 (int i)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4)
-  for (int j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f2 (short int i, char k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1)
-  for (long j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f3 (long long int i, long long int k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k)
-  for (short j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f4 (int i)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(static, 3)
-  for (int j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f5 (short int i, char k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(static, 5)
-  for (long j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f6 (long long int i, long long int k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(static, 7)
-  for (short j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f7 (int i)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(dynamic, 3)
-  for (int j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f8 (short int i, char k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(dynamic, 5)
-  for (long j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f9 (long long int i, long long int k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(dynamic, 7)
-  for (short j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f10 (int i, char start, long step)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4)
-  for (int j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f11 (short int i, char k, long start, char step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1)
-  for (long j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f12 (long long int i, long long int k, long long int start, int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k)
-  for (short j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f13 (int i, int start, long long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(static, 3)
-  for (int j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f14 (short int i, char k, unsigned long long int start, int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(static, 5)
-  for (long j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f15 (long long int i, long long int k, char start, long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(static, 7)
-  for (short j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f16 (int i, int start, long long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(dynamic, 3)
-  for (int j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f17 (short int i, char k, long start, int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(dynamic, 5)
-  for (long j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f18 (long long int i, long long int k, short start, long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(dynamic, 7)
-  for (short j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-void
-verify (void)
-{
-  int err;
-  #pragma omp target map(from:err)
-  {
-    err = 0;
-    for (int i = 0; i < 256; i++)
-      if (a[i] != (((i & 3) == 0 && i >= 8
-		    && i < 8 + 48 * 4)
-		   ? ((i - 8) / 4) + 16 : 0))
-	err = 1;
-    __builtin_memset (a, 0, sizeof (a));
-  }
-  if (err)
-    __builtin_abort ();
-}
-
-int
-main ()
-{
-#define TEST(x) x; verify ()
-  TEST (f1 (8));
-  TEST (f2 (8, 3));
-  TEST (f3 (8LL, 4LL));
-  TEST (f4 (8));
-  TEST (f5 (8, 3));
-  TEST (f6 (8LL, 4LL));
-  TEST (f7 (8));
-  TEST (f8 (8, 3));
-  TEST (f9 (8LL, 4LL));
-  TEST (f10 (8, 16, 2));
-  TEST (f11 (8, 3, 16, 2));
-  TEST (f12 (8LL, 4LL, 16, 2));
-  TEST (f13 (8, 16, 2));
-  TEST (f14 (8, 3, 16, 2));
-  TEST (f15 (8LL, 4LL, 16, 2));
-  TEST (f16 (8, 16, 2));
-  TEST (f17 (8, 3, 16, 2));
-  TEST (f18 (8LL, 4LL, 16, 2));
-  return 0;
-}
--- libgomp/testsuite/libgomp.c++/linear-2.C.jj	2015-07-17 15:26:20.000000000 +0200
+++ libgomp/testsuite/libgomp.c++/linear-2.C	2015-10-12 19:16:53.194003469 +0200
@@ -1,261 +0,0 @@
-#pragma omp declare target
-int a[256];
-#pragma omp end declare target
-
-template <typename T>
-__attribute__((noinline, noclone)) void
-f1 (T &i)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4)
-  for (int j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f2 (short int i, char k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1)
-  for (long j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f3 (long long int &i, long long int k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k)
-  for (short j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f4 (int i)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(static, 3)
-  for (int j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f5 (short int i, char k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(static, 5)
-  for (long j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-template <int N>
-__attribute__((noinline, noclone)) void
-f6 (long long int &i, long long int k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(static, 7)
-  for (short j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f7 (int i)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(dynamic, 3)
-  for (int j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f8 (short int &i, char &k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(dynamic, 5)
-  for (long j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f9 (long long int i, long long int k)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(dynamic, 7)
-  for (short j = 16; j < 64; j++)
-    {
-      a[i] = j;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f10 (int i, char start, long step)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4)
-  for (int j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f11 (short int &i, char &k, long &start, char step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1)
-  for (long j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f12 (long long int i, long long int k, long long int start, int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k)
-  for (short j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f13 (int i, int start, long long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(static, 3)
-  for (int j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f14 (short int i, char k, unsigned long long int start, int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(static, 5)
-  for (long j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-template <typename T>
-__attribute__((noinline, noclone)) void
-f15 (T &i, T k, char &start, long int &step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(static, 7)
-  for (short j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-template <typename T>
-__attribute__((noinline, noclone)) void
-f16 (T i, T start, long long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: 4) schedule(dynamic, 3)
-  for (int j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f17 (short int i, char k, long start, int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k + 1) schedule(dynamic, 5)
-  for (long j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-__attribute__((noinline, noclone)) void
-f18 (long long int i, long long int k, short start, long int step)
-{
-  #pragma omp target teams distribute parallel for linear (i: k) schedule(dynamic, 7)
-  for (short j = start; j < 112; j += step)
-    {
-      a[i] = j / 2 + 8;
-      i += 4;
-    }
-}
-
-void
-verify (void)
-{
-  int err;
-  #pragma omp target map(from:err)
-  {
-    err = 0;
-    for (int i = 0; i < 256; i++)
-      if (a[i] != (((i & 3) == 0 && i >= 8
-		    && i < 8 + 48 * 4)
-		   ? ((i - 8) / 4) + 16 : 0))
-	err = 1;
-    __builtin_memset (a, 0, sizeof (a));
-  }
-  if (err)
-    __builtin_abort ();
-}
-
-int
-main ()
-{
-#define TEST(x) x; verify ()
-  int vi = 8;
-  TEST (f1 (vi));
-  TEST (f2 (8, 3));
-  long long int vll = 8LL;
-  TEST (f3 (vll, 4LL));
-  TEST (f4 (8));
-  TEST (f5 (8, 3));
-  vll = 8LL;
-  TEST (f6<9> (vll, 4LL));
-  TEST (f7 (8));
-  short int vs = 8;
-  char vk = 3;
-  TEST (f8 (vs, vk));
-  TEST (f9 (8LL, 4LL));
-  TEST (f10 (8, 16, 2));
-  vs = 8;
-  vk = 3;
-  long int vl = 16;
-  TEST (f11 (vs, vk, vl, 2));
-  TEST (f12 (8LL, 4LL, 16, 2));
-  TEST (f13 (8, 16, 2));
-  TEST (f14 (8, 3, 16, 2));
-  vll = 8LL;
-  vk = 16;
-  vl = 2;
-  TEST (f15 (vll, 4LL, vk, vl));
-  vi = 8;
-  int vi2 = 16;
-  TEST (f16<int &> (vi, vi2, 2));
-  TEST (f17 (8, 3, 16, 2));
-  TEST (f18 (8LL, 4LL, 16, 2));
-  return 0;
-}
