2015-09-10 Jakub Jelinek <jakub@redhat.com>
+ PR c++/67522
+ * semantics.c (handle_omp_array_sections_1): Only run
+ type_dependent_expression_p on VAR_DECL/PARM_DECLs.
+ (finish_omp_clauses) <case OMP_CLAUSE_LINEAR>: Likewise.
+ Don't adjust OMP_CLAUSE_LINEAR_STEP if OMP_CLAUSE_DECL
+ is not a VAR_DECL/PARM_DECL.
+
PR c++/67511
* semantics.c (handle_omp_for_class_iterator): Don't wrap
error_mark_node into a NOP_EXPR to void_type_node.
{
if (error_operand_p (t))
return error_mark_node;
- if (type_dependent_expression_p (t))
- return NULL_TREE;
if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
{
if (processing_template_decl)
omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
return error_mark_node;
}
+ if (type_dependent_expression_p (t))
+ return NULL_TREE;
t = convert_from_reference (t);
return t;
}
goto check_dup_generic;
case OMP_CLAUSE_LINEAR:
t = OMP_CLAUSE_DECL (c);
- if (!type_dependent_expression_p (t)
+ if ((VAR_P (t) || TREE_CODE (t) == PARM_DECL)
+ && !type_dependent_expression_p (t)
&& !INTEGRAL_TYPE_P (TREE_TYPE (t))
&& TREE_CODE (TREE_TYPE (t)) != POINTER_TYPE)
{
else
{
t = mark_rvalue_use (t);
- if (!processing_template_decl)
+ if (!processing_template_decl
+ && (VAR_P (OMP_CLAUSE_DECL (c))
+ || TREE_CODE (OMP_CLAUSE_DECL (c)) == PARM_DECL))
{
if (TREE_CODE (OMP_CLAUSE_DECL (c)) == PARM_DECL)
t = maybe_constant_value (t);
--- /dev/null
+// PR c++/67522
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct S;
+
+template <int N>
+void
+foo (void)
+{
+ #pragma omp simd linear (S) // { dg-error "is not a variable in clause" }
+ for (int i = 0; i < 16; i++)
+ ;
+
+ #pragma omp target map (S[0:10]) // { dg-error "is not a variable in" }
+ ;
+
+ #pragma omp task depend (inout: S[0:10]) // { dg-error "is not a variable in" }
+ ;
+}
+
+void
+bar ()
+{
+ foo <0> ();
+}