Hi!

I've backported a couple of patches to gcc-6-branch after
bootstrapping/regtesting them on x86_64-linux and i686-linux.

        Jakub
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2016-12-21  Jakub Jelinek  <ja...@redhat.com>

        PR fortran/78866
        * openmp.c (resolve_omp_clauses): Diagnose assumed size arrays in
        OpenMP map, to and from clauses.
        * trans-openmp.c: Include diagnostic-core.h, temporarily redefining
        GCC_DIAG_STYLE to __gcc_tdiag__.
        (gfc_omp_finish_clause): Diagnose implicitly mapped assumed size
        arrays.

        * gfortran.dg/gomp/map-1.f90: Add expected error.
        * gfortran.dg/gomp/pr78866-1.f90: New test.
        * gfortran.dg/gomp/pr78866-2.f90: New test.

--- gcc/fortran/openmp.c        (revision 243859)
+++ gcc/fortran/openmp.c        (revision 243860)
@@ -3530,6 +3530,11 @@ resolve_omp_clauses (gfc_code *code, gfc
                    else
                      resolve_oacc_data_clauses (n->sym, n->where, name);
                  }
+               else if (list != OMP_CLAUSE_DEPEND
+                        && n->sym->as
+                        && n->sym->as->type == AS_ASSUMED_SIZE)
+                 gfc_error ("Assumed size array %qs in %s clause at %L",
+                            n->sym->name, name, &n->where);
              }
 
            if (list != OMP_LIST_DEPEND)
--- gcc/fortran/trans-openmp.c  (revision 243859)
+++ gcc/fortran/trans-openmp.c  (revision 243860)
@@ -37,6 +37,11 @@ along with GCC; see the file COPYING3.
 #include "arith.h"
 #include "omp-low.h"
 #include "gomp-constants.h"
+#undef GCC_DIAG_STYLE
+#define GCC_DIAG_STYLE __gcc_tdiag__
+#include "diagnostic-core.h"
+#undef GCC_DIAG_STYLE
+#define GCC_DIAG_STYLE __gcc_gfc__
 
 int ompws_flags;
 
@@ -1028,6 +1033,21 @@ gfc_omp_finish_clause (tree c, gimple_se
     return;
 
   tree decl = OMP_CLAUSE_DECL (c);
+
+  /* Assumed-size arrays can't be mapped implicitly, they have to be
+     mapped explicitly using array sections.  */
+  if (TREE_CODE (decl) == PARM_DECL
+      && GFC_ARRAY_TYPE_P (TREE_TYPE (decl))
+      && GFC_TYPE_ARRAY_AKIND (TREE_TYPE (decl)) == GFC_ARRAY_UNKNOWN
+      && GFC_TYPE_ARRAY_UBOUND (TREE_TYPE (decl),
+                               GFC_TYPE_ARRAY_RANK (TREE_TYPE (decl)) - 1)
+        == NULL)
+    {
+      error_at (OMP_CLAUSE_LOCATION (c),
+               "implicit mapping of assumed size array %qD", decl);
+      return;
+    }
+
   tree c2 = NULL_TREE, c3 = NULL_TREE, c4 = NULL_TREE;
   if (POINTER_TYPE_P (TREE_TYPE (decl)))
     {
--- gcc/testsuite/gfortran.dg/gomp/pr78866-1.f90        (nonexistent)
+++ gcc/testsuite/gfortran.dg/gomp/pr78866-1.f90        (revision 243860)
@@ -0,0 +1,19 @@
+! PR fortran/78866
+! { dg-do compile }
+
+subroutine pr78866(x)
+  integer :: x(*)
+!$omp target map(x)                    ! { dg-error "Assumed size array" }
+  x(1) = 1
+!$omp end target
+!$omp target data map(tofrom: x)       ! { dg-error "Assumed size array" }
+!$omp target update to(x)              ! { dg-error "Assumed size array" }
+!$omp target update from(x)            ! { dg-error "Assumed size array" }
+!$omp end target data
+!$omp target map(x(:23))               ! { dg-bogus "Assumed size array" }
+  x(1) = 1
+!$omp end target
+!$omp target map(x(:))                 ! { dg-error "upper bound of assumed 
size array section" }
+  x(1) = 1                             ! { dg-error "not a proper array 
section" "" { target *-*-* } .-1 }
+!$omp end target
+end
--- gcc/testsuite/gfortran.dg/gomp/pr78866-2.f90        (nonexistent)
+++ gcc/testsuite/gfortran.dg/gomp/pr78866-2.f90        (revision 243860)
@@ -0,0 +1,9 @@
+! PR fortran/78866
+! { dg-do compile }
+
+subroutine pr78866(x)
+  integer :: x(*)
+!$omp target           ! { dg-error "implicit mapping of assumed size array" }
+  x(1) = 1
+!$omp end target
+end
--- gcc/testsuite/gfortran.dg/gomp/map-1.f90    (revision 243859)
+++ gcc/testsuite/gfortran.dg/gomp/map-1.f90    (revision 243860)
@@ -70,7 +70,7 @@ subroutine test(aas)
   ! { dg-error "Rightmost upper bound of assumed size array section not 
specified" "" { target *-*-* } 68 }
   ! { dg-error "'aas' in MAP clause at \\\(1\\\) is not a proper array 
section" "" { target *-*-* } 68 }
 
-  !$omp target map(aas) ! { dg-error "The upper bound in the last dimension 
must appear" "" { xfail *-*-* } }
+  !$omp target map(aas) ! { dg-error "Assumed size array" }
   !$omp end target
 
   !$omp target map(aas(5:7))
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2017-01-04  Jakub Jelinek  <ja...@redhat.com>

        PR c++/71182
        * parser.c (cp_lexer_previous_token): Use vec_safe_address in the
        assertion, as lexer->buffer may be NULL.

        * g++.dg/cpp0x/pr71182.C: New test.

--- gcc/cp/parser.c     (revision 244069)
+++ gcc/cp/parser.c     (revision 244070)
@@ -766,7 +766,7 @@ cp_lexer_previous_token (cp_lexer *lexer
   /* Skip past purged tokens.  */
   while (tp->purged_p)
     {
-      gcc_assert (tp != lexer->buffer->address ());
+      gcc_assert (tp != vec_safe_address (lexer->buffer));
       tp--;
     }
 
--- gcc/testsuite/g++.dg/cpp0x/pr71182.C        (nonexistent)
+++ gcc/testsuite/g++.dg/cpp0x/pr71182.C        (revision 244070)
@@ -0,0 +1,12 @@
+// PR c++/71182
+// { dg-do compile { target c++11 } }
+
+class A {
+  template <typename> void As();
+};
+template <typename T> class B : A {
+  void f() {
+    A *g ;
+    g ? g->As<T>() : nullptr;
+  }
+};
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2017-01-04  Jakub Jelinek  <ja...@redhat.com>

        PR c++/78693
        * parser.c (cp_parser_simple_declaration): Only complain about
        inconsistent auto deduction if auto_result doesn't use auto.

        * g++.dg/cpp0x/pr78693.C: New test.

--- gcc/cp/parser.c     (revision 244073)
+++ gcc/cp/parser.c     (revision 244074)
@@ -12799,9 +12799,11 @@ cp_parser_simple_declaration (cp_parser*
            }
        }
 
-      if (auto_result)
+      if (auto_result
+         && (!processing_template_decl || !type_uses_auto (auto_result)))
        {
-         if (last_type && last_type != error_mark_node
+         if (last_type
+             && last_type != error_mark_node
              && !same_type_p (auto_result, last_type))
            {
              /* If the list of declarators contains more than one declarator,
--- gcc/testsuite/g++.dg/cpp0x/pr78693.C        (nonexistent)
+++ gcc/testsuite/g++.dg/cpp0x/pr78693.C        (revision 244074)
@@ -0,0 +1,31 @@
+// PR c++/78693
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void
+foo (T t)
+{
+  auto i = t, j = 1;           // { dg-bogus "inconsistent deduction" }
+}
+
+template <class T>
+void
+bar (T t)
+{
+  auto i = 1, j = t, k = 2;    // { dg-bogus "inconsistent deduction" }
+}
+
+template <class T, class U>
+void
+foo (T t, U u)
+{
+  auto i = t, j = u;           // { dg-bogus "inconsistent deduction" }
+}
+
+void
+foo ()
+{
+  foo (0);
+  bar (0);
+  foo (1, 2);
+}
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2017-01-04  Jakub Jelinek  <ja...@redhat.com>

        PR c++/78949
        * typeck.c (cp_build_unary_op): Call mark_rvalue_use on arg if it has
        vector type.

        * c-c++-common/Wunused-var-16.c: New test.

--- gcc/cp/typeck.c     (revision 244074)
+++ gcc/cp/typeck.c     (revision 244075)
@@ -5848,6 +5848,8 @@ cp_build_unary_op (enum tree_code code,
        errstring = _("wrong type argument to bit-complement");
       else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
        arg = cp_perform_integral_promotions (arg, complain);
+      else if (!noconvert && VECTOR_TYPE_P (TREE_TYPE (arg)))
+       arg = mark_rvalue_use (arg);
       break;
 
     case ABS_EXPR:
--- gcc/testsuite/c-c++-common/Wunused-var-16.c (nonexistent)
+++ gcc/testsuite/c-c++-common/Wunused-var-16.c (revision 244075)
@@ -0,0 +1,15 @@
+/* PR c++/78949 */
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+typedef unsigned char V __attribute__((vector_size(16)));
+V v;
+
+void
+foo ()
+{
+  V y = {};
+  V x = {};    // { dg-bogus "set but not used" }
+  y &= ~x;
+  v = y;
+}
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2017-01-11  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/50199
        * lto-lang.c (lto_post_options): Force flag_merge_constants = 1
        if it was 0.

        * gcc.dg/lto/pr50199_0.c: New test.

--- gcc/lto/lto-lang.c  (revision 244303)
+++ gcc/lto/lto-lang.c  (revision 244304)
@@ -857,6 +857,12 @@ lto_post_options (const char **pfilename
      support.  */
   flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
 
+  /* When partitioning, we can tear appart STRING_CSTs uses from the same
+     TU into multiple partitions.  Without constant merging the constants
+     might not be equal at runtime.  See PR50199.  */
+  if (!flag_merge_constants)
+    flag_merge_constants = 1;
+
   /* Initialize the compiler back end.  */
   return false;
 }
--- gcc/testsuite/gcc.dg/lto/pr50199_0.c        (nonexistent)
+++ gcc/testsuite/gcc.dg/lto/pr50199_0.c        (revision 244304)
@@ -0,0 +1,17 @@
+/* PR middle-end/50199 */
+/* { dg-lto-options {{-O2 -flto -fno-merge-constants 
--param=lto-min-partition=1}} } */
+
+__attribute__ ((noinline)) const char *
+foo (const char *x)
+{
+  return x;
+}
+
+int
+main ()
+{
+  const char *a = "ab";
+  if (a != foo (a))
+    __builtin_abort ();
+  return 0;
+}
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2017-01-11  Jakub Jelinek  <ja...@redhat.com>

        PR c++/78341
        * parser.c (cp_parser_std_attribute_spec): Remove over-eager
        assertion.  Formatting fix.

        * g++.dg/cpp0x/pr78341.C: New test.

--- gcc/cp/parser.c     (revision 244328)
+++ gcc/cp/parser.c     (revision 244329)
@@ -24925,11 +24925,7 @@ cp_parser_std_attribute_spec (cp_parser
 
       if (!cp_parser_parse_definitely (parser))
        {
-         gcc_assert (alignas_expr == error_mark_node
-                     || alignas_expr == NULL_TREE);
-
-         alignas_expr =
-           cp_parser_assignment_expression (parser);
+         alignas_expr = cp_parser_assignment_expression (parser);
          if (alignas_expr == error_mark_node)
            cp_parser_skip_to_end_of_statement (parser);
          if (alignas_expr == NULL_TREE
--- gcc/testsuite/g++.dg/cpp0x/pr78341.C        (nonexistent)
+++ gcc/testsuite/g++.dg/cpp0x/pr78341.C        (revision 244329)
@@ -0,0 +1,4 @@
+// PR c++/78341
+// { dg-do compile { target c++11 } }
+
+alignas (alignas double // { dg-error "" }
2017-01-17  Jakub Jelinek  <ja...@redhat.com>

        PR debug/78839
        * dwarf2out.c (field_byte_offset): Restore the
        PCC_BITFIELD_TYPE_MATTERS behavior for INTEGER_CST DECL_FIELD_OFFSET
        and DECL_FIELD_BIT_OFFSET.  Use fold_build2 instead of build2 + fold.
        (analyze_variants_discr, gen_variant_part): Use fold_build2 instead
        of build2 + fold.

--- gcc/dwarf2out.c     (revision 244544)
+++ gcc/dwarf2out.c     (revision 244545)
@@ -17980,10 +17980,6 @@ static dw_loc_descr_ref
 field_byte_offset (const_tree decl, struct vlr_context *ctx,
                   HOST_WIDE_INT *cst_offset)
 {
-  offset_int object_offset_in_bits;
-  offset_int object_offset_in_bytes;
-  offset_int bitpos_int;
-  bool is_byte_offset_cst, is_bit_offset_cst;
   tree tree_result;
   dw_loc_list_ref loc_result;
 
@@ -17994,20 +17990,21 @@ field_byte_offset (const_tree decl, stru
   else
     gcc_assert (TREE_CODE (decl) == FIELD_DECL);
 
-  is_bit_offset_cst = TREE_CODE (DECL_FIELD_BIT_OFFSET (decl)) != INTEGER_CST;
-  is_byte_offset_cst = TREE_CODE (DECL_FIELD_OFFSET (decl)) != INTEGER_CST;
-
   /* We cannot handle variable bit offsets at the moment, so abort if it's the
      case.  */
-  if (is_bit_offset_cst)
+  if (TREE_CODE (DECL_FIELD_BIT_OFFSET (decl)) != INTEGER_CST)
     return NULL;
 
 #ifdef PCC_BITFIELD_TYPE_MATTERS
   /* We used to handle only constant offsets in all cases.  Now, we handle
      properly dynamic byte offsets only when PCC bitfield type doesn't
      matter.  */
-  if (PCC_BITFIELD_TYPE_MATTERS && is_byte_offset_cst && is_bit_offset_cst)
+  if (PCC_BITFIELD_TYPE_MATTERS
+      && TREE_CODE (DECL_FIELD_OFFSET (decl)) == INTEGER_CST)
     {
+      offset_int object_offset_in_bits;
+      offset_int object_offset_in_bytes;
+      offset_int bitpos_int;
       tree type;
       tree field_size_tree;
       offset_int deepest_bitpos;
@@ -18102,13 +18099,23 @@ field_byte_offset (const_tree decl, stru
          object_offset_in_bits
            = round_up_to_align (object_offset_in_bits, decl_align_in_bits);
        }
+
+      object_offset_in_bytes
+       = wi::lrshift (object_offset_in_bits, LOG2_BITS_PER_UNIT);
+      if (ctx->variant_part_offset == NULL_TREE)
+       {
+         *cst_offset = object_offset_in_bytes.to_shwi ();
+         return NULL;
+       }
+      tree_result = wide_int_to_tree (sizetype, object_offset_in_bytes);
     }
+  else
 #endif /* PCC_BITFIELD_TYPE_MATTERS */
+    tree_result = byte_position (decl);
 
-  tree_result = byte_position (decl);
   if (ctx->variant_part_offset != NULL_TREE)
-    tree_result = fold (build2 (PLUS_EXPR, TREE_TYPE (tree_result),
-                               ctx->variant_part_offset, tree_result));
+    tree_result = fold_build2 (PLUS_EXPR, TREE_TYPE (tree_result),
+                              ctx->variant_part_offset, tree_result);
 
   /* If the byte offset is a constant, it's simplier to handle a native
      constant rather than a DWARF expression.  */
@@ -23744,14 +23751,12 @@ analyze_variants_discr (tree variant_par
 
              if (!lower_cst_included)
                lower_cst
-                 = fold (build2 (PLUS_EXPR, TREE_TYPE (lower_cst),
-                                 lower_cst,
-                                 build_int_cst (TREE_TYPE (lower_cst), 1)));
+                 = fold_build2 (PLUS_EXPR, TREE_TYPE (lower_cst), lower_cst,
+                                build_int_cst (TREE_TYPE (lower_cst), 1));
              if (!upper_cst_included)
                upper_cst
-                 = fold (build2 (MINUS_EXPR, TREE_TYPE (upper_cst),
-                                 upper_cst,
-                                 build_int_cst (TREE_TYPE (upper_cst), 1)));
+                 = fold_build2 (MINUS_EXPR, TREE_TYPE (upper_cst), upper_cst,
+                                build_int_cst (TREE_TYPE (upper_cst), 1));
 
              if (!get_discr_value (lower_cst,
                                    &new_node->dw_discr_lower_bound)
@@ -23922,8 +23927,8 @@ gen_variant_part (tree variant_part_decl
                 we recurse.  */
 
              vlr_sub_ctx.variant_part_offset
-               = fold (build2 (PLUS_EXPR, TREE_TYPE (variant_part_offset),
-                               variant_part_offset, byte_position (member)));
+               = fold_build2 (PLUS_EXPR, TREE_TYPE (variant_part_offset),
+                              variant_part_offset, byte_position (member));
              gen_variant_part (member, &vlr_sub_ctx, variant_die);
            }
          else

Reply via email to