re PR c++/53565 (FAIL: libgomp.c++/for-7.C)
authorJason Merrill <jason@redhat.com>
Mon, 25 Jun 2012 15:17:48 +0000 (11:17 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 25 Jun 2012 15:17:48 +0000 (11:17 -0400)
PR c++/53565
* pt.c (tsubst_omp_for_iterator): Simplify DECL_EXPR handling.
(tsubst_expr) [OMP_FOR]: Here, too.

From-SVN: r188939

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/gomp/for-19.C

index 93233a892b53759f6d0405d09b7bb8a3a044bf76..df3a9177b451220a251f63dfe747002180cee96c 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-25  Jason Merrill  <jason@redhat.com>
+
+       PR c++/53565
+       * pt.c (tsubst_omp_for_iterator): Simplify DECL_EXPR handling.
+       (tsubst_expr) [OMP_FOR]: Here, too.
+
 2012-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/53594
index 5e02c8c41930c2bc60c56f3a91221be2e71dfca7..ad7134b4d978570d9ecae50cdb782517bed9f2ce 100644 (file)
@@ -12659,22 +12659,24 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
 #define RECUR(NODE)                            \
   tsubst_expr ((NODE), args, complain, in_decl,        \
               integral_constant_expression_p)
-  tree decl, init, cond, incr, auto_node;
+  tree decl, init, cond, incr;
+  bool init_decl;
 
   init = TREE_VEC_ELT (OMP_FOR_INIT (t), i);
   gcc_assert (TREE_CODE (init) == MODIFY_EXPR);
-  decl = RECUR (TREE_OPERAND (init, 0));
+  decl = TREE_OPERAND (init, 0);
   init = TREE_OPERAND (init, 1);
-  auto_node = type_uses_auto (TREE_TYPE (decl));
-  if (auto_node && init)
+  /* Do this before substituting into decl to handle 'auto'.  */
+  init_decl = (init && TREE_CODE (init) == DECL_EXPR);
+  init = RECUR (init);
+  decl = RECUR (decl);
+  if (init_decl)
     {
-      tree init_expr = init;
-      if (TREE_CODE (init_expr) == DECL_EXPR)
-       init_expr = DECL_INITIAL (DECL_EXPR_DECL (init_expr));
-      init_expr = RECUR (init_expr);
-      TREE_TYPE (decl)
-       = do_auto_deduction (TREE_TYPE (decl), init_expr, auto_node);
+      gcc_assert (!processing_template_decl);
+      init = DECL_INITIAL (decl);
+      DECL_INITIAL (decl) = NULL_TREE;
     }
+
   gcc_assert (!type_dependent_expression_p (decl));
 
   if (!CLASS_TYPE_P (TREE_TYPE (decl)))
@@ -12695,7 +12697,7 @@ tsubst_omp_for_iterator (tree t, int i, tree declv, tree initv,
       return;
     }
 
-  if (init && TREE_CODE (init) != DECL_EXPR)
+  if (init && !init_decl)
     {
       tree c;
       for (c = *clauses; c ; c = OMP_CLAUSE_CHAIN (c))
@@ -13189,34 +13191,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
        condv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t)));
        incrv = make_tree_vec (TREE_VEC_LENGTH (OMP_FOR_INIT (t)));
 
+       stmt = begin_omp_structured_block ();
+
        for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (t)); i++)
          tsubst_omp_for_iterator (t, i, declv, initv, condv, incrv,
                                   &clauses, args, complain, in_decl,
                                   integral_constant_expression_p);
 
-       stmt = begin_omp_structured_block ();
-
-       for (i = 0; i < TREE_VEC_LENGTH (initv); i++)
-         if (TREE_VEC_ELT (initv, i) == NULL
-             || TREE_CODE (TREE_VEC_ELT (initv, i)) != DECL_EXPR)
-           TREE_VEC_ELT (initv, i) = RECUR (TREE_VEC_ELT (initv, i));
-         else if (CLASS_TYPE_P (TREE_TYPE (TREE_VEC_ELT (initv, i))))
-           {
-             tree init = RECUR (TREE_VEC_ELT (initv, i));
-             gcc_assert (init == TREE_VEC_ELT (declv, i));
-             TREE_VEC_ELT (initv, i) = NULL_TREE;
-           }
-         else
-           {
-             tree decl_expr = TREE_VEC_ELT (initv, i);
-             tree init = DECL_INITIAL (DECL_EXPR_DECL (decl_expr));
-             gcc_assert (init != NULL);
-             TREE_VEC_ELT (initv, i) = RECUR (init);
-             DECL_INITIAL (DECL_EXPR_DECL (decl_expr)) = NULL;
-             RECUR (decl_expr);
-             DECL_INITIAL (DECL_EXPR_DECL (decl_expr)) = init;
-           }
-
        pre_body = push_stmt_list ();
        RECUR (OMP_FOR_PRE_BODY (t));
        pre_body = pop_stmt_list (pre_body);
index 7c56719cc1615ca2816523fd41f400670a83c941..4441a29b7ec8097a64dc62698a46fc79964aae35 100644 (file)
@@ -26,8 +26,8 @@ template <typename T>
 void
 f3 (void)
 {
-#pragma omp for                // { dg-error "forbids incrementing a pointer of type" }
-  for (T q = T (p); q < T (p + 4); q++)
+#pragma omp for
+  for (T q = T (p); q < T (p + 4); q++)        // { dg-error "forbids incrementing a pointer of type" }
     ;
 }