re PR c++/67522 (OpenMP ICE in type_dependent_expression_p)
authorJakub Jelinek <jakub@redhat.com>
Thu, 10 Sep 2015 07:34:42 +0000 (09:34 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 10 Sep 2015 07:34:42 +0000 (09:34 +0200)
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.

* g++.dg/gomp/pr67522.C: New test.

From-SVN: r227610

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr67522.C [new file with mode: 0644]

index 4b32f5ae3832a4aa303dff4791aa990c1282d3f2..32646e0a1bac3715182bb42d7b012a01dedd412c 100644 (file)
@@ -1,5 +1,12 @@
 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.
index 5c3f1bea808646bb79ec19192b2851f40126a0f0..0897ff70d4b03cc4af3725811ba3b866b53f5fbe 100644 (file)
@@ -4294,8 +4294,6 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
     {
       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)
@@ -4318,6 +4316,8 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
                    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;
     }
@@ -5332,7 +5332,8 @@ finish_omp_clauses (tree clauses)
          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)
            {
@@ -5359,7 +5360,9 @@ finish_omp_clauses (tree clauses)
          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);
index e055c442c440e38af2790f65108b88b318992c97..d1d4cd4671ae3d2a865bdd1d5b7802fbaeeacf7c 100644 (file)
@@ -1,5 +1,8 @@
 2015-09-10  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/67522
+       * g++.dg/gomp/pr67522.C: New test.
+
        PR middle-end/67521
        * c-c++-common/gomp/pr67521.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/gomp/pr67522.C b/gcc/testsuite/g++.dg/gomp/pr67522.C
new file mode 100644 (file)
index 0000000..84c854a
--- /dev/null
@@ -0,0 +1,26 @@
+// 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> ();
+}