[gcc-6] 392/401: * Update to SVN 20170316 (r246188) from the gcc-6-branch.
Ximin Luo
infinity0 at debian.org
Wed Apr 5 15:50:43 UTC 2017
This is an automated email from the git hooks/post-receive script.
infinity0 pushed a commit to branch pu/reproducible_builds
in repository gcc-6.
commit 10bd39e6fa4aaf1ab030870d849e584242501ee9
Author: doko <doko at 6ca36cf4-e1d1-0310-8c6f-e303bb2178ca>
Date: Thu Mar 16 10:16:20 2017 +0000
* Update to SVN 20170316 (r246188) from the gcc-6-branch.
git-svn-id: svn://anonscm.debian.org/gcccvs/branches/sid/gcc-6@9370 6ca36cf4-e1d1-0310-8c6f-e303bb2178ca
---
debian/changelog | 11 +-
debian/patches/install-gcov-dump.diff | 34 -
debian/patches/svn-updates.diff | 1332 ++++++++++++++++++++++++++++++++-
debian/rules.patch | 1 -
4 files changed, 1307 insertions(+), 71 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index d862a3b..4a53a4e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,16 @@
gcc-6 (6.3.0-9) UNRELEASED; urgency=medium
- * Update to SVN 20170313 (r246084) from the gcc-6-branch.
+ * Update to SVN 20170316 (r246188) from the gcc-6-branch.
- Fix PR target/79261 (PPC), PR fortran/78474, PR libstdc++/79789,
PR target/79514 (x86), PR target/79544 (PPC), PR lto/79579,
PR target/79749 (sparc), PR target/79261 (PPC), PR fortran/78474,
PR fortran/78331, PR target/77850 (PA), PR target/79439 (PPC),
- PR c++/79796, PR ada/79903, PR ada/79945.
+ PR c++/79796, PR ada/79903, PR ada/79945, PR libstdc++/80034,
+ PR c++/79962, PR c++/79984, PR c/79756, PR tree-optimization/79732,
+ PR target/80019 (x86), PR target/79752 (PPC), PR middle-end/80004,
+ PR target/49244 (x86), PR tree-optimization/79977, PR middle-end/79971,
+ PR tree-optimization/79666, PR middle-end/79576, PR c++/72775,
+ PR c++/79900, PR c++/79687, PR c++/79264, PR c++/61636, PR fortran/79894.
* gcj-6: Fix ecj1 symlink on i386. Closes: #856903.
* Fix libcc1.so symlink for cross compilers. Addresses: #856875.
* dpkg-buildflags stopped fiddling around with spec files; remove
@@ -17,7 +22,7 @@ gcc-6 (6.3.0-9) UNRELEASED; urgency=medium
* Install the gcov-dump utility.
* Allow to use lld with -fuse-ld=ld.lld.
- -- Matthias Klose <doko at debian.org> Mon, 13 Mar 2017 12:57:04 +0100
+ -- Matthias Klose <doko at debian.org> Thu, 16 Mar 2017 11:01:17 +0100
gcc-6 (6.3.0-8) unstable; urgency=medium
diff --git a/debian/patches/install-gcov-dump.diff b/debian/patches/install-gcov-dump.diff
deleted file mode 100644
index 451cdb8..0000000
--- a/debian/patches/install-gcov-dump.diff
+++ /dev/null
@@ -1,34 +0,0 @@
-# DP: Install gcov-dump.
-
-gcc/ChangeLog:
-
-2017-03-14 Martin Liska <mliska at suse.cz>
-
- * Makefile.in: Install gcov-dump.
-
---- a/src/gcc/Makefile.in
-+++ b/src/gcc/Makefile.in
-@@ -806,6 +806,7 @@ GCC_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo gcc|sed '$(progra
- CPP_INSTALL_NAME := $(shell echo cpp|sed '$(program_transform_name)')
- GCOV_INSTALL_NAME := $(shell echo gcov|sed '$(program_transform_name)')
- GCOV_TOOL_INSTALL_NAME := $(shell echo gcov-tool|sed '$(program_transform_name)')
-+GCOV_DUMP_INSTALL_NAME := $(shell echo gcov-dump|sed '$(program_transform_name)')
-
- # Setup the testing framework, if you have one
- EXPECT = `if [ -f $${rootme}/../expect/expect ] ; then \
-@@ -3519,6 +3520,15 @@ install-common: native lang.install-common installdirs
- gcov-tool$(exeext) $(DESTDIR)$(bindir)/$(GCOV_TOOL_INSTALL_NAME)$(exeext); \
- fi; \
- fi
-+# Install gcov-dump if it was compiled.
-+ -if test "$(enable_as_accelerator)" != "yes" ; then \
-+ if [ -f gcov-dump$(exeext) ]; \
-+ then \
-+ rm -f $(DESTDIR)$(bindir)/$(GCOV_DUMP_INSTALL_NAME)$(exeext); \
-+ $(INSTALL_PROGRAM) \
-+ gcov-dump$(exeext) $(DESTDIR)$(bindir)/$(GCOV_DUMP_INSTALL_NAME)$(exeext); \
-+ fi; \
-+ fi
-
- # Install the driver program as $(target_noncanonical)-gcc,
- # $(target_noncanonical)-gcc-$(version), and also as gcc if native.
diff --git a/debian/patches/svn-updates.diff b/debian/patches/svn-updates.diff
index ec28113..c131751 100644
--- a/debian/patches/svn-updates.diff
+++ b/debian/patches/svn-updates.diff
@@ -1,10 +1,10 @@
-# DP: updates from the 6 branch upto 20170313 (r246084).
+# DP: updates from the 6 branch upto 20170316 (r246188).
last_update()
{
cat > ${dir}LAST_UPDATED <EOF
-Mon Mar 13 12:55:26 CET 2017
-Mon Mar 13 11:55:26 UTC 2017 (revision 246084)
+Thu Mar 16 10:56:04 CET 2017
+Thu Mar 16 09:56:04 UTC 2017 (revision 246188)
EOF
}
@@ -1433,7 +1433,7 @@ Index: libstdc++-v3/include/bits/list.tcc
- ++__first1;
- if (__first2 != __last2)
- _M_transfer(__last1, __first2, __last2);
-+ size_t __orig_size = __x.size();
++ const size_t __orig_size = __x.size();
+ __try {
+ while (__first1 != __last1 && __first2 != __last2)
+ if (*__first2 < *__first1)
@@ -1454,7 +1454,7 @@ Index: libstdc++-v3/include/bits/list.tcc
+ }
+ __catch(...)
+ {
-+ size_t __dist = distance(__first2, __last2);
++ const size_t __dist = std::distance(__first2, __last2);
+ this->_M_inc_size(__orig_size - __dist);
+ __x._M_set_size(__dist);
+ __throw_exception_again;
@@ -1477,7 +1477,7 @@ Index: libstdc++-v3/include/bits/list.tcc
- ++__first1;
- if (__first2 != __last2)
- _M_transfer(__last1, __first2, __last2);
-+ size_t __orig_size = __x.size();
++ const size_t __orig_size = __x.size();
+ __try
+ {
+ while (__first1 != __last1 && __first2 != __last2)
@@ -1499,7 +1499,7 @@ Index: libstdc++-v3/include/bits/list.tcc
+ }
+ __catch(...)
+ {
-+ size_t __dist = distance(__first2, __last2);
++ const size_t __dist = std::distance(__first2, __last2);
+ this->_M_inc_size(__orig_size - __dist);
+ __x._M_set_size(__dist);
+ __throw_exception_again;
@@ -1687,7 +1687,20 @@ Index: libstdc++-v3/ChangeLog
===================================================================
--- a/src/libstdc++-v3/ChangeLog (.../tags/gcc_6_3_0_release)
+++ b/src/libstdc++-v3/ChangeLog (.../branches/gcc-6-branch)
-@@ -1,3 +1,264 @@
+@@ -1,3 +1,277 @@
++2017-03-14 Jonathan Wakely <jwakely at redhat.com>
++
++ * testsuite/17_intro/names.cc: Undefine macros that clash with
++ identifiers in AIX system headers.
++
++2017-03-13 Ville Voutilainen <ville.voutilainen at gmail.com>
++
++ PR libstdc++/80034
++ * include/bits/list.tcc (merge(list&&)): Use const for the size_t
++ in the function and in the catch-block, qualify uses of std::distance.
++ (merge(list&&, _StrictWeakOrdering)): Likewise.
++ * testsuite/23_containers/list/operations/80034.cc: New.
++
+2017-03-10 George Lander <george.lander at arm.com>
+
+ * acinclude.m4 (glibcxx_cv_obsolete_isnan): Define
@@ -2703,6 +2716,43 @@ Index: libstdc++-v3/testsuite/23_containers/multiset/operations/2.cc
}
+Index: libstdc++-v3/testsuite/23_containers/list/operations/80034.cc
+===================================================================
+--- a/src/libstdc++-v3/testsuite/23_containers/list/operations/80034.cc (.../tags/gcc_6_3_0_release)
++++ b/src/libstdc++-v3/testsuite/23_containers/list/operations/80034.cc (.../branches/gcc-6-branch)
+@@ -0,0 +1,32 @@
++// { dg-do compile }
++// Copyright (C) 2017 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library. This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 3, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING3. If not see
++// <http://www.gnu.org/licenses/>.
++
++#include <list>
++
++namespace X {
++ struct Y { };
++ bool operator<(Y, Y) { return false; }
++ template<typename T>
++ void distance(T, T) { }
++}
++
++int main()
++{
++ std::list<X::Y> l;
++ l.sort();
++}
Index: libstdc++-v3/testsuite/23_containers/list/operations/78389.cc
===================================================================
--- a/src/libstdc++-v3/testsuite/23_containers/list/operations/78389.cc (.../tags/gcc_6_3_0_release)
@@ -3080,7 +3130,7 @@ Index: libstdc++-v3/testsuite/17_intro/names.cc
===================================================================
--- a/src/libstdc++-v3/testsuite/17_intro/names.cc (.../tags/gcc_6_3_0_release)
+++ b/src/libstdc++-v3/testsuite/17_intro/names.cc (.../branches/gcc-6-branch)
-@@ -0,0 +1,101 @@
+@@ -0,0 +1,110 @@
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
@@ -3181,6 +3231,15 @@ Index: libstdc++-v3/testsuite/17_intro/names.cc
+#define x (
+#define y (
+#define z (
++
++#ifdef _AIX
++// See https://gcc.gnu.org/ml/libstdc++/2017-03/msg00015.html
++#undef f
++#undef r
++#undef x
++#undef y
++#endif
++
+#include <bits/stdc++.h>
Index: libstdc++-v3/testsuite/libstdc++-xmethods/shared_ptr.cc
===================================================================
@@ -3795,7 +3854,47 @@ Index: gcc/tree-vrp.c
===================================================================
--- a/src/gcc/tree-vrp.c (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/tree-vrp.c (.../branches/gcc-6-branch)
-@@ -7057,8 +7057,7 @@
+@@ -2651,8 +2651,17 @@
+ min = build_symbolic_expr (expr_type, sym_min_op0,
+ neg_min_op0, min);
+ else if (sym_min_op1)
+- min = build_symbolic_expr (expr_type, sym_min_op1,
+- neg_min_op1 ^ minus_p, min);
++ {
++ /* We may not negate if that might introduce
++ undefined overflow. */
++ if (! minus_p
++ || neg_min_op1
++ || TYPE_OVERFLOW_WRAPS (expr_type))
++ min = build_symbolic_expr (expr_type, sym_min_op1,
++ neg_min_op1 ^ minus_p, min);
++ else
++ min = NULL_TREE;
++ }
+
+ /* Likewise for the upper bound. */
+ if (sym_max_op0 == sym_max_op1)
+@@ -2661,8 +2670,17 @@
+ max = build_symbolic_expr (expr_type, sym_max_op0,
+ neg_max_op0, max);
+ else if (sym_max_op1)
+- max = build_symbolic_expr (expr_type, sym_max_op1,
+- neg_max_op1 ^ minus_p, max);
++ {
++ /* We may not negate if that might introduce
++ undefined overflow. */
++ if (! minus_p
++ || neg_max_op1
++ || TYPE_OVERFLOW_WRAPS (expr_type))
++ max = build_symbolic_expr (expr_type, sym_max_op1,
++ neg_max_op1 ^ minus_p, max);
++ else
++ max = NULL_TREE;
++ }
+ }
+ else
+ {
+@@ -7057,8 +7075,7 @@
static enum ssa_prop_result
vrp_visit_assignment_or_call (gimple *stmt, tree *output_p)
{
@@ -3805,7 +3904,7 @@ Index: gcc/tree-vrp.c
enum gimple_code code = gimple_code (stmt);
lhs = gimple_get_lhs (stmt);
-@@ -7175,8 +7174,7 @@
+@@ -7175,8 +7192,7 @@
}
/* Every other statement produces no useful ranges. */
@@ -3838,7 +3937,23 @@ Index: gcc/c-family/ChangeLog
===================================================================
--- a/src/gcc/c-family/ChangeLog (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/c-family/ChangeLog (.../branches/gcc-6-branch)
-@@ -1,3 +1,12 @@
+@@ -1,3 +1,28 @@
++2017-03-14 Marek Polacek <polacek at redhat.com>
++
++ PR c++/79962
++ PR c++/79984
++ * c-common.c (handle_nonnull_attribute): Save the result of default
++ conversion to the attribute list.
++
++2017-03-14 Richard Biener <rguenther at suse.de>
++
++ Backport from mainline
++ 2017-03-02 Richard Biener <rguenther at suse.de>
++
++ PR c/79756
++ * c-common.c (c_common_mark_addressable_vec): Look through
++ C_MAYBE_CONST_EXPR.
++
+2017-01-10 Martin Liska <mliska at suse.cz>
+
+ Backport from mainline
@@ -3851,6 +3966,28 @@ Index: gcc/c-family/ChangeLog
2016-12-21 Release Manager
* GCC 6.3.0 released.
+Index: gcc/c-family/c-common.c
+===================================================================
+--- a/src/gcc/c-family/c-common.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/c-family/c-common.c (.../branches/gcc-6-branch)
+@@ -9061,7 +9061,7 @@
+ tree arg = TREE_VALUE (args);
+ if (arg && TREE_CODE (arg) != IDENTIFIER_NODE
+ && TREE_CODE (arg) != FUNCTION_DECL)
+- arg = default_conversion (arg);
++ TREE_VALUE (args) = arg = default_conversion (arg);
+
+ if (!get_nonnull_operand (arg, &arg_num))
+ {
+@@ -10677,6 +10677,8 @@
+ void
+ c_common_mark_addressable_vec (tree t)
+ {
++ if (TREE_CODE (t) == C_MAYBE_CONST_EXPR)
++ t = C_MAYBE_CONST_EXPR_EXPR (t);
+ while (handled_component_p (t))
+ t = TREE_OPERAND (t, 0);
+ if (!VAR_P (t)
Index: gcc/ipa-polymorphic-call.c
===================================================================
--- a/src/gcc/ipa-polymorphic-call.c (.../tags/gcc_6_3_0_release)
@@ -3958,7 +4095,7 @@ Index: gcc/DATESTAMP
+++ b/src/gcc/DATESTAMP (.../branches/gcc-6-branch)
@@ -1 +1 @@
-20161221
-+20170313
++20170316
Index: gcc/postreload.c
===================================================================
--- a/src/gcc/postreload.c (.../tags/gcc_6_3_0_release)
@@ -4403,7 +4540,73 @@ Index: gcc/ChangeLog
===================================================================
--- a/src/gcc/ChangeLog (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/ChangeLog (.../branches/gcc-6-branch)
-@@ -1,3 +1,796 @@
+@@ -1,3 +1,862 @@
++2017-03-16 Richard Biener <rguenther at suse.de>
++
++ Backport from mainline
++ 2017-02-28 Richard Biener <rguenther at suse.de>
++
++ PR tree-optimization/79732
++ * tree-inline.c (expand_call_inline): Handle anonymous
++ SSA lhs properly when inlining a function without return
++ value.
++
++2017-03-15 Matthias Klose <doko at ubuntu.com>
++
++ Backport from mainline
++ 2017-03-14 Martin Liska <mliska at suse.cz>
++
++ * Makefile.in: Install gcov-dump.
++
++2017-03-15 Uros Bizjak <ubizjak at gmail.com>
++
++ PR target/80019
++ * config/i386/i386.c (ix86_vector_duplicate_value): Create
++ subreg of inner mode for values already in registers.
++
++2017-03-14 Aaron Sawdey <acsawdey at linux.vnet.ibm.com>
++
++ Backport from mainline
++ 2017-02-28 Aaron Sawdey <acsawdey at linux.vnet.ibm.com>
++
++ PR target/79752
++ * config/rs6000/rs6000.md (peephole2 for udiv/umod): Should emit
++ udiv rather than div since input pattern is unsigned.
++
++2017-03-14 Richard Biener <rguenther at suse.de>
++
++ Backport from mainline
++ 2016-05-02 Jakub Jelinek <jakub at redhat.com>
++
++ PR middle-end/80004
++ PR target/49244
++ * gimple.c (gimple_builtin_call_types_compatible_p): Allow
++ char/short arguments promoted to int because of promote_prototypes.
++
++ 2017-03-09 Richard Biener <rguenther at suse.de>
++
++ PR tree-optimization/79977
++ * graphite-scop-detection.c (scop_detection::merge_sese):
++ Handle the case of extra exits to blocks dominating the entry.
++
++ 2017-03-09 Richard Biener <rguenther at suse.de>
++
++ PR middle-end/79971
++ * gimple-expr.c (useless_type_conversion_p): Preserve
++ TYPE_SATURATING for fixed-point types.
++
++ 2017-02-22 Richard Biener <rguenther at suse.de>
++
++ PR tree-optimization/79666
++ * tree-vrp.c (extract_range_from_binary_expr_1): Make sure
++ to not symbolically negate if that may introduce undefined
++ overflow.
++
++ 2017-02-17 Richard Biener <rguenther at suse.de>
++
++ PR middle-end/79576
++ * params.def (max-ssa-name-query-depth): Limit to 10.
++
+2017-03-07 Uros Bizjak <ubizjak at gmail.com>
+
+ Backport from mainline
@@ -5200,7 +5403,7 @@ Index: gcc/ChangeLog
2016-12-21 Release Manager
* GCC 6.3.0 released.
-@@ -68,11 +865,11 @@
+@@ -68,11 +931,11 @@
Backport from mainline
2016-11-07 Bernd Schmidt <bschmidt at redhat.com>
@@ -6640,6 +6843,24 @@ Index: gcc/testsuite/gcc.target/i386/pr79514.c
+{
+ bar (x);
+}
+Index: gcc/testsuite/gcc.target/i386/pr80019.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.target/i386/pr80019.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/gcc.target/i386/pr80019.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,13 @@
++/* PR target/80019 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -mxop -mavx2" } */
++
++typedef char v16qi __attribute__ ((vector_size (16)));
++
++extern v16qi b, c;
++
++void
++foo (int e)
++{
++ b = c << e;
++}
Index: gcc/testsuite/gcc.target/i386/pr79495.c
===================================================================
--- a/src/gcc/testsuite/gcc.target/i386/pr79495.c (.../tags/gcc_6_3_0_release)
@@ -7256,6 +7477,19 @@ Index: gcc/testsuite/gnat.dg/array28_pkg.ads
+ function F return Inner_Type;
+
+end Array28_Pkg;
+Index: gcc/testsuite/gcc.dg/vector-1.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/vector-1.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/gcc.dg/vector-1.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,8 @@
++/* { dg-do compile } */
++/* { dg-options "-std=gnu90" } */
++
++typedef int V __attribute__ ((vector_size(4)));
++void fn1 ()
++{
++ (V){(1,0)}[0] = 0;
++}
Index: gcc/testsuite/gcc.dg/goacc/loop-processing-1.c
===================================================================
--- a/src/gcc/testsuite/gcc.dg/goacc/loop-processing-1.c (.../tags/gcc_6_3_0_release)
@@ -7289,6 +7523,25 @@ Index: gcc/testsuite/gcc.dg/spellcheck-options-13.c
+/* { dg-do compile } */
+/* { dg-options "-fsanitize" } */
+/* { dg-error "unrecognized command line option .-fsanitize..$" "" { target *-*-* } 0 } */
+Index: gcc/testsuite/gcc.dg/fixed-point/pr79971.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/fixed-point/pr79971.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/gcc.dg/fixed-point/pr79971.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,14 @@
++/* { dg-do compile } */
++/* { dg-options "-O3" } */
++
++void
++a ()
++{
++ unsigned _Accum b;
++ for (b = 0.1; b; b += 0.1uk)
++ {
++ _Sat unsigned _Accum b;
++ for (b = 0; b <= 0.8; b = 0.1)
++ ;
++ }
++}
Index: gcc/testsuite/gcc.dg/graphite/pr71824-2.c
===================================================================
--- a/src/gcc/testsuite/gcc.dg/graphite/pr71824-2.c (.../tags/gcc_6_3_0_release)
@@ -7374,6 +7627,38 @@ Index: gcc/testsuite/gcc.dg/graphite/pr71824.c
+ d = 0;
+ }
+}
+Index: gcc/testsuite/gcc.dg/graphite/pr79977.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/graphite/pr79977.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/gcc.dg/graphite/pr79977.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,27 @@
++/* { dg-do compile } */
++/* { dg-options "-O2 -floop-nest-optimize" } */
++
++int uo[3];
++int di;
++
++void
++i7 (int mp)
++{
++ int l4;
++
++wh:
++ while (l4 > 1)
++ {
++ for (di = 0; di < 2; ++di)
++ uo[di] = 0;
++
++ for (di = 0; di < 3; ++di)
++ {
++ uo[di] = 0;
++ if (mp != 0)
++ goto wh;
++ }
++
++ --l4;
++ }
++}
Index: gcc/testsuite/gcc.dg/comp-goto-4.c
===================================================================
--- a/src/gcc/testsuite/gcc.dg/comp-goto-4.c (.../tags/gcc_6_3_0_release)
@@ -7488,6 +7773,41 @@ Index: gcc/testsuite/gcc.dg/torture/pr71055.c
+ foo (&u);
+ return 0;
+}
+Index: gcc/testsuite/gcc.dg/torture/pr79666.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/torture/pr79666.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/gcc.dg/torture/pr79666.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,30 @@
++/* { dg-do run } */
++
++struct
++{
++ unsigned a:6;
++} b;
++
++int c, e, g = 7;
++signed char d, f = 6, h = -10;
++
++void fn1 ()
++{
++ for (; c < 9; c++)
++ {
++ if (f)
++ g = ~(~0 / (g ^ e));
++ b.a = ~0;
++ d = ~((h ^ b.a) & 132 & (~(f && g) | (d && 1)));
++ e = ~0;
++ if (d < 127 || f < 1)
++ continue;
++ g = 0;
++ }
++}
++
++int main ()
++{
++ fn1 ();
++ return 0;
++}
Index: gcc/testsuite/gcc.dg/torture/pr78742.c
===================================================================
--- a/src/gcc/testsuite/gcc.dg/torture/pr78742.c (.../tags/gcc_6_3_0_release)
@@ -7513,6 +7833,16 @@ Index: gcc/testsuite/gcc.dg/torture/pr78742.c
+
+ foo();
+}
+Index: gcc/testsuite/gcc.dg/torture/pr79732.c
+===================================================================
+--- a/src/gcc/testsuite/gcc.dg/torture/pr79732.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/gcc.dg/torture/pr79732.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,5 @@
++/* { dg-do link } */
++
++int bar () __attribute__ ((alias ("foo")));
++void foo () { }
++int main () { return bar(); }
Index: gcc/testsuite/gcc.dg/tree-ssa/pr78886.c
===================================================================
--- a/src/gcc/testsuite/gcc.dg/tree-ssa/pr78886.c (.../tags/gcc_6_3_0_release)
@@ -7564,7 +7894,86 @@ Index: gcc/testsuite/ChangeLog
===================================================================
--- a/src/gcc/testsuite/ChangeLog (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/testsuite/ChangeLog (.../branches/gcc-6-branch)
-@@ -1,3 +1,464 @@
+@@ -1,3 +1,543 @@
++2017-03-16 Richard Biener <rguenther at suse.de>
++
++ Backport from mainline
++ 2017-02-28 Richard Biener <rguenther at suse.de>
++
++ PR tree-optimization/79732
++ * gcc.dg/torture/pr79732.c: New testcase.
++
++2017-03-15 Uros Bizjak <ubizjak at gmail.com>
++
++ PR target/80019
++ * gcc.target/i386/pr80019.c: New test.
++
++2017-03-15 Marek Polacek <polacek at redhat.com>
++
++ Backported from mainline
++ 2016-12-14 Marek Polacek <polacek at redhat.com>
++
++ PR c++/72775
++ * g++.dg/ext/flexary12.C: Adjust dg-error.
++ * g++.dg/ext/flexary20.C: New.
++ * g++.dg/ext/flexary21.C: New.
++
++2017-03-14 Marek Polacek <polacek at redhat.com>
++
++ Backported from mainline
++ 2017-03-09 Marek Polacek <polacek at redhat.com>
++
++ PR c++/79900 - ICE in strip_typedefs
++ * g++.dg/warn/Wpadded-1.C: New test.
++
++ PR c++/79687
++ * g++.dg/expr/ptrmem8.C: New test.
++ * g++.dg/expr/ptrmem9.C: New test.
++
++ Backported from mainline
++ 2017-01-31 Nathan Sidwell <nathan at acm.org>
++
++ PR c++/79264
++ * g++.dg/cpp1y/pr61636-1.C: Augment.
++
++ Backported from mainline
++ 2017-01-17 Nathan Sidwell <nathan at acm.org>
++
++ PR c++/61636
++ * g++.dg/cpp1y/pr61636-1.C: New.
++ * g++.dg/cpp1y/pr61636-2.C: New.
++ * g++.dg/cpp1y/pr61636-3.C: New.
++
++2017-03-14 Marek Polacek <polacek at redhat.com>
++
++ PR c++/79962
++ PR c++/79984
++ * c-c++-common/nonnull-3.c: New test.
++ * g++.dg/warn/Wnonnull3.C: New test.
++
++2017-03-14 Richard Biener <rguenther at suse.de>
++
++ Backport from mainline
++ 2017-03-09 Richard Biener <rguenther at suse.de>
++
++ PR tree-optimization/79977
++ * gcc.dg/graphite/pr79977.c: New testcase.
++
++ 2017-03-09 Richard Biener <rguenther at suse.de>
++
++ PR middle-end/79971
++ * gcc.dg/fixed-point/pr79971.c: New testcase.
++
++ 2017-03-02 Richard Biener <rguenther at suse.de>
++
++ PR c/79756
++ * gcc.dg/vector-1.c: New testcase.
++
++ 2017-02-22 Richard Biener <rguenther at suse.de>
++
++ PR tree-optimization/79666
++ * gcc.dg/torture/pr79666.c: New testcase.
++
+2017-03-07 Marek Polacek <polacek at redhat.com>
+
+ Backported from mainline
@@ -8029,7 +8438,7 @@ Index: gcc/testsuite/ChangeLog
2016-12-21 Release Manager
* GCC 6.3.0 released.
-@@ -46,8 +507,8 @@
+@@ -46,8 +586,8 @@
Backport from mainline
2016-11-07 Bernd Schmidt <bschmidt at redhat.com>
@@ -8040,7 +8449,7 @@ Index: gcc/testsuite/ChangeLog
2016-12-12 Thomas Preud'homme <thomas.preudhomme at arm.com>
-@@ -456,7 +917,7 @@
+@@ -456,7 +996,7 @@
* g++.dg/torture/pr77822.C: New test.
2016-11-20 Harald Anlauf <anlauf at gmx.de>
@@ -8517,6 +8926,47 @@ Index: gcc/testsuite/g++.dg/ipa/pr71207.C
+
+ return 0;
+}
+Index: gcc/testsuite/g++.dg/cpp1y/pr61636-1.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/cpp1y/pr61636-1.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/cpp1y/pr61636-1.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,36 @@
++// PR c++/61636
++// PR c++/79264
++// { dg-do compile { target c++14 } }
++
++// ICE because we figure this capture too late.
++
++struct Base
++{
++ void Bar (int);
++};
++
++struct A : Base {
++ void b ();
++ void Foo (int);
++ using Base::Bar;
++ template <typename T> void Baz (T);
++};
++
++void A::b() {
++
++ auto lam = [&](auto asdf) { Foo (asdf); };
++
++ lam (0);
++
++ auto lam1 = [&](auto asdf) { Bar (asdf); };
++
++ lam1 (0);
++
++ auto lam2 = [&](auto asdf) { Baz (asdf); };
++
++ lam2 (0);
++
++ auto lam3 = [&](auto asdf) { Baz<int> (asdf); };
++
++ lam3 (0);
++}
Index: gcc/testsuite/g++.dg/cpp1y/constexpr-union1.C
===================================================================
--- a/src/gcc/testsuite/g++.dg/cpp1y/constexpr-union1.C (.../tags/gcc_6_3_0_release)
@@ -8533,6 +8983,200 @@ Index: gcc/testsuite/g++.dg/cpp1y/constexpr-union1.C
+ };
+};
+Optional opt{};
+Index: gcc/testsuite/g++.dg/cpp1y/pr61636-2.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/cpp1y/pr61636-2.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/cpp1y/pr61636-2.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,72 @@
++// PR c++/61636
++// { dg-do run { target c++14 } }
++
++// Check we don't capture this (too) unnecessarily
++
++struct A {
++ int b ();
++ void f (int) {}
++ static void f (double) {}
++
++ static void g (int) {}
++ static void g (double) {}
++};
++
++struct O {
++ void x (int) {}
++ static void x (double) {}
++};
++
++namespace N {
++ void y (double) {}
++}
++
++int Check (bool expect, unsigned size)
++{
++ return (expect ? sizeof (void *) : 1) != size;
++}
++
++int A::b() {
++ int r = 0;
++
++ // one of the functions is non-static
++ auto l0 = [&](auto z) { f (z); };
++ r += Check (true, sizeof l0);
++ l0(0.0); // doesn't need this capture for A::f(double), but too late
++ l0 (0); // Needs this capture for A::f(int)
++
++ // no fn is non-static.
++ auto l00 = [&](auto z) { g (z); };
++ r += Check (false, sizeof l00);
++ l00(0.0);
++ l00 (0);
++
++ // sizeof isn't an evaluation context, so no this capture
++ auto l1 = [&](auto z) { sizeof (f (z), 1); };
++ r += Check (false, sizeof l1);
++ l1(0.0); l1 (0);
++
++ auto l2 = [&](auto) { f (2.4); };
++ auto l3 = [&](auto) { f (0); };
++ l2(0); l3(0); l2(0.0); l3 (0.0);
++ r += Check (false, sizeof l2);
++ r += Check (true, sizeof l3);
++
++ auto l4 = [&](auto) { O::x (2.4); };
++ auto l5 = [&](auto) { N::y (2.4); };
++ auto l6 = [&](auto) { };
++ l4(0); l5(0); l6(0);
++ l4(0.0); l5(0.0); l6(0.0);
++ r += Check (false, sizeof l4);
++ r += Check (false, sizeof l5);
++ r += Check (false, sizeof l6);
++
++ return r;
++}
++
++int main ()
++{
++ A a;
++
++ return a.b () ? 1 : 0;
++}
+Index: gcc/testsuite/g++.dg/cpp1y/pr61636-3.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/cpp1y/pr61636-3.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/cpp1y/pr61636-3.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,25 @@
++// PR c++/61636
++// { dg-do compile { target c++14 } }
++// permissiveness doesn't make this permitted
++// { dg-additional-options "-fpermissive" }
++
++// ICE because we attempt to use dependent Foo during error recovery
++// and die with an unexpected this capture need.
++
++template <typename T> struct Base
++{
++ void Foo (int);
++};
++
++template <typename T> struct A : Base<T> {
++ void b ();
++};
++
++template <typename T> void A<T>::b() {
++
++ auto lam = [&](auto asdf) { Foo (asdf); }; // { dg-error "not declared" }
++
++ lam (T(0));
++}
++
++template void A<int>::b ();
+Index: gcc/testsuite/g++.dg/ext/flexary21.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/ext/flexary21.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/ext/flexary21.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,15 @@
++// PR c++/72775
++// { dg-do compile { target c++11 } }
++// { dg-options -Wno-pedantic }
++
++struct S {
++ int i;
++ char a[];
++ S () : a("bob") {} // { dg-error "member initializer for flexible array member" }
++};
++
++struct T {
++ int i;
++ char a[] = "bob";
++ T () : a("bob") {} // { dg-error "member initializer for flexible array member" }
++};
+Index: gcc/testsuite/g++.dg/ext/flexary20.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/ext/flexary20.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/ext/flexary20.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,49 @@
++// PR c++/72775
++// { dg-do compile { target c++11 } }
++// { dg-options -Wno-pedantic }
++
++struct S {
++ int i;
++ char a[] = "foo";
++ S () {} // { dg-error "member initializer for flexible array member" }
++};
++
++struct T { // { dg-error "member initializer for flexible array member" }
++ int i;
++ char a[] = "foo";
++};
++
++struct U {
++ int i;
++ char a[] = "foo";
++ U ();
++};
++
++U::U() {} // { dg-error "member initializer for flexible array member" }
++
++int
++main ()
++{
++ struct T t;
++}
++
++struct V {
++ int i;
++ struct W { // { dg-error "member initializer for flexible array member" }
++ int j;
++ char a[] = "foo";
++ } w;
++ V () {}
++};
++
++template <class T>
++struct X { // { dg-error "member initializer for flexible array member" }
++ int i;
++ T a[] = "foo";
++};
++
++void
++fn ()
++{
++ struct X<char> x;
++}
+Index: gcc/testsuite/g++.dg/ext/flexary12.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/ext/flexary12.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/ext/flexary12.C (.../branches/gcc-6-branch)
+@@ -44,7 +44,7 @@
+ D ();
+ };
+
+-D::D ():
++D::D (): // { dg-error "member initializer for flexible array member" }
+ a ("c") // { dg-error "incompatible types in assignment of .const char \\\[2\\\]. to .int \\\[\\\]." }
+ { }
+
Index: gcc/testsuite/g++.dg/vect/pr36648.cc
===================================================================
--- a/src/gcc/testsuite/g++.dg/vect/pr36648.cc (.../tags/gcc_6_3_0_release)
@@ -8593,6 +9237,50 @@ Index: gcc/testsuite/g++.dg/lookup/pr79377.C
+ foo<int> (a);
+ if (A::c != 4 || a.a != 4) __builtin_abort ();
+}
+Index: gcc/testsuite/g++.dg/expr/ptrmem9.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/expr/ptrmem9.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/expr/ptrmem9.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,19 @@
++// PR c++/79687
++// { dg-do run }
++
++struct A
++{
++ char c;
++};
++
++int main()
++{
++ static char A::* p1 = &A::c;
++ char A::* const q1 = p1;
++
++ char A::* p2 = &A::c;
++ static char A::* const q2 = p2;
++
++ A a;
++ return (&(a.*q1) - &a.c) || (&(a.*q2) - &a.c);
++}
+Index: gcc/testsuite/g++.dg/expr/ptrmem8.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/expr/ptrmem8.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/expr/ptrmem8.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,15 @@
++// PR c++/79687
++// { dg-do run }
++
++struct A
++{
++ char c;
++};
++
++int main()
++{
++ char A::* p = &A::c;
++ static char A::* const q = p;
++ A a;
++ return &(a.*q) - &a.c;
++}
Index: gcc/testsuite/g++.dg/gomp/pr79429.C
===================================================================
--- a/src/gcc/testsuite/g++.dg/gomp/pr79429.C (.../tags/gcc_6_3_0_release)
@@ -8601,6 +9289,53 @@ Index: gcc/testsuite/g++.dg/gomp/pr79429.C
+// PR c++/79429
+
+#pragma omp ordered // { dg-error "expected declaration specifiers" }
+Index: gcc/testsuite/g++.dg/warn/Wnonnull3.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/warn/Wnonnull3.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/warn/Wnonnull3.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,15 @@
++// PR c++/79962
++// { dg-options "-Wnonnull" }
++
++template <class T>
++__attribute__ ((__nonnull__ (T::i))) void f (typename T::U) { }
++
++struct S1 { enum { i = 1 }; typedef void* U; };
++struct S2 { static const int i = 1; typedef void* U; };
++
++void
++g ()
++{
++ f<S1>(0); // { dg-warning "null argument where non-null required" }
++ f<S2>(0); // { dg-warning "null argument where non-null required" }
++}
+Index: gcc/testsuite/g++.dg/warn/Wpadded-1.C
+===================================================================
+--- a/src/gcc/testsuite/g++.dg/warn/Wpadded-1.C (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/g++.dg/warn/Wpadded-1.C (.../branches/gcc-6-branch)
+@@ -0,0 +1,22 @@
++// PR c++/79900 - ICE in strip_typedefs
++// { dg-do compile }
++// { dg-options "-Wpadded" }
++
++template <class> struct A;
++template <typename> struct B { // { dg-warning "padding struct size to alignment boundary" }
++ long long _M_off;
++ char _M_state;
++};
++template <> struct A<char> { typedef B<int> pos_type; };
++enum _Ios_Openmode {};
++struct C {
++ typedef _Ios_Openmode openmode;
++};
++template <typename, typename _Traits> struct D {
++ typedef typename _Traits::pos_type pos_type;
++ pos_type m_fn1(pos_type, C::openmode);
++};
++template class D<char, A<char> >;
++template <typename _CharT, typename _Traits>
++typename D<_CharT, _Traits>::pos_type D<_CharT, _Traits>::m_fn1(pos_type x,
++ C::openmode) { return x; }
Index: gcc/testsuite/g++.dg/template/bitfield3.C
===================================================================
--- a/src/gcc/testsuite/g++.dg/template/bitfield3.C (.../tags/gcc_6_3_0_release)
@@ -8680,6 +9415,22 @@ Index: gcc/testsuite/c-c++-common/Wunused-var-16.c
+ y &= ~x;
+ v = y;
+}
+Index: gcc/testsuite/c-c++-common/nonnull-3.c
+===================================================================
+--- a/src/gcc/testsuite/c-c++-common/nonnull-3.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/testsuite/c-c++-common/nonnull-3.c (.../branches/gcc-6-branch)
+@@ -0,0 +1,11 @@
++/* PR c++/79984 */
++/* { dg-do compile } */
++/* { dg-options "-Wnonnull-compare" } */
++
++enum { r = 1 };
++
++__attribute__ ((nonnull (r))) int
++f (int *p)
++{
++ return p == 0; /* { dg-warning "nonnull argument 'p' compared to NULL" } */
++}
Index: gcc/testsuite/c-c++-common/pr79428-3.c
===================================================================
--- a/src/gcc/testsuite/c-c++-common/pr79428-3.c (.../tags/gcc_6_3_0_release)
@@ -8750,6 +9501,39 @@ Index: gcc/cp/typeck.c
break;
case ABS_EXPR:
+Index: gcc/cp/init.c
+===================================================================
+--- a/src/gcc/cp/init.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/cp/init.c (.../branches/gcc-6-branch)
+@@ -796,6 +796,14 @@
+ in that case. */
+ init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
+ tf_warning_or_error);
++ if (TREE_CODE (type) == ARRAY_TYPE
++ && TYPE_DOMAIN (type) == NULL_TREE
++ && init != NULL_TREE)
++ {
++ error_at (DECL_SOURCE_LOCATION (current_function_decl),
++ "member initializer for flexible array member");
++ inform (DECL_SOURCE_LOCATION (member), "%q#D initialized", member);
++ }
+
+ if (init)
+ finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
+@@ -2110,6 +2118,13 @@
+ if (TREE_CODE (init) == CONSTRUCTOR
+ && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
+ break;
++ /* If the variable has a dynamic initializer, don't use its
++ DECL_INITIAL which doesn't reflect the real value. */
++ if (VAR_P (decl)
++ && TREE_STATIC (decl)
++ && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
++ && DECL_NONTRIVIALLY_INITIALIZED_P (decl))
++ break;
+ decl = unshare_expr (init);
+ }
+ return decl;
Index: gcc/cp/constexpr.c
===================================================================
--- a/src/gcc/cp/constexpr.c (.../tags/gcc_6_3_0_release)
@@ -8778,7 +9562,66 @@ Index: gcc/cp/tree.c
===================================================================
--- a/src/gcc/cp/tree.c (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/cp/tree.c (.../branches/gcc-6-branch)
-@@ -2775,7 +2775,7 @@
+@@ -1463,29 +1463,40 @@
+ result = TYPE_MAIN_VARIANT (t);
+ }
+ gcc_assert (!typedef_variant_p (result));
+- if (TYPE_USER_ALIGN (t) != TYPE_USER_ALIGN (result)
+- || TYPE_ALIGN (t) != TYPE_ALIGN (result))
++
++ if (COMPLETE_TYPE_P (result) && !COMPLETE_TYPE_P (t))
++ /* If RESULT is complete and T isn't, it's likely the case that T
++ is a variant of RESULT which hasn't been updated yet. Skip the
++ attribute handling. */;
++ else
+ {
+- gcc_assert (TYPE_USER_ALIGN (t));
+- if (remove_attributes)
+- *remove_attributes = true;
+- else
++ if (TYPE_USER_ALIGN (t) != TYPE_USER_ALIGN (result)
++ || TYPE_ALIGN (t) != TYPE_ALIGN (result))
+ {
+- if (TYPE_ALIGN (t) == TYPE_ALIGN (result))
+- result = build_variant_type_copy (result);
++ gcc_assert (TYPE_USER_ALIGN (t));
++ if (remove_attributes)
++ *remove_attributes = true;
+ else
+- result = build_aligned_type (result, TYPE_ALIGN (t));
+- TYPE_USER_ALIGN (result) = true;
++ {
++ if (TYPE_ALIGN (t) == TYPE_ALIGN (result))
++ result = build_variant_type_copy (result);
++ else
++ result = build_aligned_type (result, TYPE_ALIGN (t));
++ TYPE_USER_ALIGN (result) = true;
++ }
+ }
++
++ if (TYPE_ATTRIBUTES (t))
++ {
++ if (remove_attributes)
++ result = apply_identity_attributes (result, TYPE_ATTRIBUTES (t),
++ remove_attributes);
++ else
++ result = cp_build_type_attribute_variant (result,
++ TYPE_ATTRIBUTES (t));
++ }
+ }
+- if (TYPE_ATTRIBUTES (t))
+- {
+- if (remove_attributes)
+- result = apply_identity_attributes (result, TYPE_ATTRIBUTES (t),
+- remove_attributes);
+- else
+- result = cp_build_type_attribute_variant (result, TYPE_ATTRIBUTES (t));
+- }
++
+ return cp_build_qualified_type (result, cp_type_quals (t));
+ }
+
+@@ -2775,7 +2786,7 @@
t = make_node (code);
length = TREE_CODE_LENGTH (code);
@@ -8787,7 +9630,7 @@ Index: gcc/cp/tree.c
TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep);
for (i = 0; i < length; i++)
-@@ -2830,8 +2830,10 @@
+@@ -2830,8 +2841,10 @@
nargs = call_expr_nargs (non_dep);
expected_nargs = cp_tree_code_length (op);
@@ -8800,7 +9643,7 @@ Index: gcc/cp/tree.c
expected_nargs += 1;
gcc_assert (nargs == expected_nargs);
-@@ -4146,6 +4148,14 @@
+@@ -4146,6 +4159,14 @@
if (TREE_PUBLIC (decl))
return lk_external;
@@ -8819,7 +9662,50 @@ Index: gcc/cp/ChangeLog
===================================================================
--- a/src/gcc/cp/ChangeLog (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/cp/ChangeLog (.../branches/gcc-6-branch)
-@@ -1,3 +1,97 @@
+@@ -1,3 +1,140 @@
++2017-03-15 Marek Polacek <polacek at redhat.com>
++
++ Backported from mainline
++ 2016-12-14 Marek Polacek <polacek at redhat.com>
++
++ PR c++/72775
++ * init.c (perform_member_init): Diagnose member initializer for
++ flexible array member.
++
++2017-03-14 Marek Polacek <polacek at redhat.com>
++
++ Backported from mainline
++ 2017-03-09 Marek Polacek <polacek at redhat.com>
++
++ PR c++/79900 - ICE in strip_typedefs
++ * tree.c (strip_typedefs): Skip the attribute handling if T is
++ a variant type which hasn't been updated yet.
++
++ PR c++/79687
++ * init.c (constant_value_1): Break if the variable has a dynamic
++ initializer.
++
++ Backported from mainline
++ 2017-01-31 Nathan Sidwell <nathan at acm.org>
++
++ PR c++/79264
++ * lambda.c (maybe_generic_this_capture): Deal with template-id-exprs.
++ * semantics.c (finish_member_declaration): Assert class is being
++ defined.
++
++ Backported from mainline
++ 2017-01-17 Nathan Sidwell <nathan at acm.org>
++
++ PR c++/61636
++ * cp-tree.h (maybe_generic_this_capture): Declare.
++ * lambda.c (resolvable_dummy_lambda): New, broken out of ...
++ (maybe_resolve_dummy): ... here. Call it.
++ (maybe_generic_this_capture): New.
++ * parser.c (cp_parser_postfix_expression): Speculatively capture
++ this in generic lambda in unresolved member function call.
++ * pt.c (tsubst_copy_and_build): Force hard error from failed
++ member function lookup in generic lambda.
++
+2017-03-07 Marek Polacek <polacek at redhat.com>
+
+ Backported from mainline
@@ -8917,6 +9803,88 @@ Index: gcc/cp/ChangeLog
2016-12-21 Release Manager
* GCC 6.3.0 released.
+Index: gcc/cp/pt.c
+===================================================================
+--- a/src/gcc/cp/pt.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/cp/pt.c (.../branches/gcc-6-branch)
+@@ -16613,19 +16613,34 @@
+
+ if (unq != function)
+ {
+- tree fn = unq;
+- if (INDIRECT_REF_P (fn))
+- fn = TREE_OPERAND (fn, 0);
+- if (TREE_CODE (fn) == COMPONENT_REF)
+- fn = TREE_OPERAND (fn, 1);
+- if (is_overloaded_fn (fn))
+- fn = get_first_fn (fn);
+- if (permerror (EXPR_LOC_OR_LOC (t, input_location),
+- "%qD was not declared in this scope, "
+- "and no declarations were found by "
+- "argument-dependent lookup at the point "
+- "of instantiation", function))
++ /* In a lambda fn, we have to be careful to not
++ introduce new this captures. Legacy code can't
++ be using lambdas anyway, so it's ok to be
++ stricter. */
++ bool in_lambda = (current_class_type
++ && LAMBDA_TYPE_P (current_class_type));
++ char const *msg = "%qD was not declared in this scope, "
++ "and no declarations were found by "
++ "argument-dependent lookup at the point "
++ "of instantiation";
++
++ bool diag = true;
++ if (in_lambda)
++ error_at (EXPR_LOC_OR_LOC (t, input_location),
++ msg, function);
++ else
++ diag = permerror (EXPR_LOC_OR_LOC (t, input_location),
++ msg, function);
++ if (diag)
+ {
++ tree fn = unq;
++ if (INDIRECT_REF_P (fn))
++ fn = TREE_OPERAND (fn, 0);
++ if (TREE_CODE (fn) == COMPONENT_REF)
++ fn = TREE_OPERAND (fn, 1);
++ if (is_overloaded_fn (fn))
++ fn = get_first_fn (fn);
++
+ if (!DECL_P (fn))
+ /* Can't say anything more. */;
+ else if (DECL_CLASS_SCOPE_P (fn))
+@@ -16648,7 +16663,13 @@
+ inform (DECL_SOURCE_LOCATION (fn),
+ "%qD declared here, later in the "
+ "translation unit", fn);
++ if (in_lambda)
++ {
++ release_tree_vector (call_args);
++ RETURN (error_mark_node);
++ }
+ }
++
+ function = unq;
+ }
+ }
+Index: gcc/cp/semantics.c
+===================================================================
+--- a/src/gcc/cp/semantics.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/cp/semantics.c (.../branches/gcc-6-branch)
+@@ -2965,6 +2965,12 @@
+ /* We should see only one DECL at a time. */
+ gcc_assert (DECL_CHAIN (decl) == NULL_TREE);
+
++ /* Don't add decls after definition. */
++ gcc_assert (TYPE_BEING_DEFINED (current_class_type)
++ /* We can add lambda types when late parsing default
++ arguments. */
++ || LAMBDA_TYPE_P (TREE_TYPE (decl)));
++
+ /* Set up access control for DECL. */
+ TREE_PRIVATE (decl)
+ = (current_access_specifier == access_private_node);
Index: gcc/cp/decl2.c
===================================================================
--- a/src/gcc/cp/decl2.c (.../tags/gcc_6_3_0_release)
@@ -9037,7 +10005,15 @@ Index: gcc/cp/parser.c
tp--;
}
-@@ -12406,9 +12406,11 @@
+@@ -6867,6 +6867,7 @@
+ || type_dependent_expression_p (fn)
+ || any_type_dependent_arguments_p (args)))
+ {
++ maybe_generic_this_capture (instance, fn);
+ postfix_expression
+ = build_nt_call_vec (postfix_expression, args);
+ release_tree_vector (args);
+@@ -12406,9 +12407,11 @@
if (cp_parser_error_occurred (parser))
goto done;
@@ -9051,7 +10027,7 @@ Index: gcc/cp/parser.c
&& !same_type_p (auto_result, last_type))
{
/* If the list of declarators contains more than one declarator,
-@@ -24140,11 +24142,7 @@
+@@ -24140,11 +24143,7 @@
if (!cp_parser_parse_definitely (parser))
{
@@ -9064,7 +10040,7 @@ Index: gcc/cp/parser.c
if (alignas_expr == error_mark_node)
cp_parser_skip_to_end_of_statement (parser);
if (alignas_expr == NULL_TREE
-@@ -34060,13 +34058,6 @@
+@@ -34060,13 +34059,6 @@
{
location_t loc = pragma_tok->location;
@@ -9078,7 +10054,7 @@ Index: gcc/cp/parser.c
if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
{
tree id = cp_lexer_peek_token (parser->lexer)->u.value;
-@@ -34959,13 +34950,6 @@
+@@ -34959,13 +34951,6 @@
{
tree *pc = NULL, stmt;
@@ -9092,7 +10068,7 @@ Index: gcc/cp/parser.c
if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
{
tree id = cp_lexer_peek_token (parser->lexer)->u.value;
-@@ -35347,7 +35331,7 @@
+@@ -35347,7 +35332,7 @@
id = get_identifier ("omp declare target");
DECL_ATTRIBUTES (decl)
@@ -9101,7 +10077,7 @@ Index: gcc/cp/parser.c
if (global_bindings_p ())
{
symtab_node *node = symtab_node::get (decl);
-@@ -35887,8 +35871,11 @@
+@@ -35887,8 +35872,11 @@
}
if (!at1)
{
@@ -9114,7 +10090,7 @@ Index: gcc/cp/parser.c
if (node != NULL)
{
node->offloadable = 1;
-@@ -37404,6 +37391,8 @@
+@@ -37404,6 +37392,8 @@
return true;
case PRAGMA_OMP_ORDERED:
@@ -9123,7 +10099,7 @@ Index: gcc/cp/parser.c
stmt = push_omp_privatization_clauses (false);
ret = cp_parser_omp_ordered (parser, pragma_tok, context, if_p);
pop_omp_privatization_clauses (stmt);
-@@ -37410,6 +37399,8 @@
+@@ -37410,6 +37400,8 @@
return ret;
case PRAGMA_OMP_TARGET:
@@ -9146,6 +10122,114 @@ Index: gcc/cp/call.c
}
else
{
+Index: gcc/cp/lambda.c
+===================================================================
+--- a/src/gcc/cp/lambda.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/cp/lambda.c (.../branches/gcc-6-branch)
+@@ -746,16 +746,14 @@
+ return result;
+ }
+
+-/* We don't want to capture 'this' until we know we need it, i.e. after
+- overload resolution has chosen a non-static member function. At that
+- point we call this function to turn a dummy object into a use of the
+- 'this' capture. */
++/* Return the current LAMBDA_EXPR, if this is a resolvable dummy
++ object. NULL otherwise.. */
+
+-tree
+-maybe_resolve_dummy (tree object, bool add_capture_p)
++static tree
++resolvable_dummy_lambda (tree object)
+ {
+ if (!is_dummy_object (object))
+- return object;
++ return NULL_TREE;
+
+ tree type = TYPE_MAIN_VARIANT (TREE_TYPE (object));
+ gcc_assert (!TYPE_PTR_P (type));
+@@ -765,18 +763,63 @@
+ && LAMBDA_TYPE_P (current_class_type)
+ && lambda_function (current_class_type)
+ && DERIVED_FROM_P (type, current_nonlambda_class_type ()))
+- {
+- /* In a lambda, need to go through 'this' capture. */
+- tree lam = CLASSTYPE_LAMBDA_EXPR (current_class_type);
+- tree cap = lambda_expr_this_capture (lam, add_capture_p);
+- if (cap && cap != error_mark_node)
++ return CLASSTYPE_LAMBDA_EXPR (current_class_type);
++
++ return NULL_TREE;
++}
++
++/* We don't want to capture 'this' until we know we need it, i.e. after
++ overload resolution has chosen a non-static member function. At that
++ point we call this function to turn a dummy object into a use of the
++ 'this' capture. */
++
++tree
++maybe_resolve_dummy (tree object, bool add_capture_p)
++{
++ if (tree lam = resolvable_dummy_lambda (object))
++ if (tree cap = lambda_expr_this_capture (lam, add_capture_p))
++ if (cap != error_mark_node)
+ object = build_x_indirect_ref (EXPR_LOCATION (object), cap,
+ RO_NULL, tf_warning_or_error);
+- }
+
+ return object;
+ }
+
++/* When parsing a generic lambda containing an argument-dependent
++ member function call we defer overload resolution to instantiation
++ time. But we have to know now whether to capture this or not.
++ Do that if FNS contains any non-static fns.
++ The std doesn't anticipate this case, but I expect this to be the
++ outcome of discussion. */
++
++void
++maybe_generic_this_capture (tree object, tree fns)
++{
++ if (tree lam = resolvable_dummy_lambda (object))
++ if (!LAMBDA_EXPR_THIS_CAPTURE (lam))
++ {
++ /* We've not yet captured, so look at the function set of
++ interest. */
++ if (BASELINK_P (fns))
++ fns = BASELINK_FUNCTIONS (fns);
++ bool id_expr = TREE_CODE (fns) == TEMPLATE_ID_EXPR;
++ if (id_expr)
++ fns = TREE_OPERAND (fns, 0);
++ for (; fns; fns = OVL_NEXT (fns))
++ {
++ tree fn = OVL_CURRENT (fns);
++
++ if ((!id_expr || TREE_CODE (fn) == TEMPLATE_DECL)
++ && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
++ {
++ /* Found a non-static member. Capture this. */
++ lambda_expr_this_capture (lam, true);
++ break;
++ }
++ }
++ }
++}
++
+ /* Returns the innermost non-lambda function. */
+
+ tree
+Index: gcc/cp/cp-tree.h
+===================================================================
+--- a/src/gcc/cp/cp-tree.h (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/cp/cp-tree.h (.../branches/gcc-6-branch)
+@@ -6447,6 +6447,7 @@
+ extern bool is_normal_capture_proxy (tree);
+ extern void register_capture_members (tree);
+ extern tree lambda_expr_this_capture (tree, bool);
++extern void maybe_generic_this_capture (tree, tree);
+ extern tree maybe_resolve_dummy (tree, bool);
+ extern tree current_nonlambda_function (void);
+ extern tree nonlambda_method_basetype (void);
Index: gcc/cp/name-lookup.c
===================================================================
--- a/src/gcc/cp/name-lookup.c (.../tags/gcc_6_3_0_release)
@@ -10443,7 +11527,15 @@ Index: gcc/fortran/ChangeLog
===================================================================
--- a/src/gcc/fortran/ChangeLog (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/fortran/ChangeLog (.../branches/gcc-6-branch)
-@@ -1,3 +1,59 @@
+@@ -1,3 +1,67 @@
++2017-03-14 Richard Biener <rguenther at suse.de>
++
++ Backport from mainline
++ 2017-03-06 Richard Biener <rguenther at suse.de>
++
++ PR fortran/79894
++ * trans.c (gfc_add_modify_loc): Weaken assert.
++
+2017-02-25 Paul Thomas <pault at gcc.gnu.org>
+
+ PR fortran/78474
@@ -10557,6 +11649,24 @@ Index: gcc/fortran/module.c
/* Check that we haven't already USEd an intrinsic module with the
same name. */
+Index: gcc/fortran/trans.c
+===================================================================
+--- a/src/gcc/fortran/trans.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/fortran/trans.c (.../branches/gcc-6-branch)
+@@ -151,11 +151,11 @@
+ tree t1, t2;
+ t1 = TREE_TYPE (rhs);
+ t2 = TREE_TYPE (lhs);
+- /* Make sure that the types of the rhs and the lhs are the same
++ /* Make sure that the types of the rhs and the lhs are compatible
+ for scalar assignments. We should probably have something
+ similar for aggregates, but right now removing that check just
+ breaks everything. */
+- gcc_checking_assert (t1 == t2
++ gcc_checking_assert (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)
+ || AGGREGATE_TYPE_P (TREE_TYPE (lhs)));
+
+ tmp = fold_build2_loc (loc, MODIFY_EXPR, void_type_node, lhs,
Index: gcc/fortran/trans-types.c
===================================================================
--- a/src/gcc/fortran/trans-types.c (.../tags/gcc_6_3_0_release)
@@ -10724,7 +11834,33 @@ Index: gcc/graphite-scop-detection.c
===================================================================
--- a/src/gcc/graphite-scop-detection.c (.../tags/gcc_6_3_0_release)
+++ b/src/gcc/graphite-scop-detection.c (.../branches/gcc-6-branch)
-@@ -905,7 +905,19 @@
+@@ -817,6 +817,25 @@
+ != loop_depth (exit->dest->loop_father))
+ return invalid_sese;
+
++ /* For now we just bail out when there is a loop exit in the region
++ that is not also the exit of the region. We could enlarge the
++ region to cover the loop that region exits to. See PR79977. */
++ if (loop_outer (entry->src->loop_father))
++ {
++ vec<edge> exits = get_loop_exit_edges (entry->src->loop_father);
++ for (unsigned i = 0; i < exits.length (); ++i)
++ {
++ if (exits[i] != exit
++ && bb_in_region (exits[i]->src, entry->dest, exit->src))
++ {
++ DEBUG_PRINT (dp << "[scop-detection-fail] cannot merge seses.\n");
++ exits.release ();
++ return invalid_sese;
++ }
++ }
++ exits.release ();
++ }
++
+ /* For now we just want to bail out when exit does not post-dominate entry.
+ TODO: We might just add a basic_block at the exit to make exit
+ post-dominate entry (the entire region). */
+@@ -905,7 +924,19 @@
sese_l combined = merge_sese (s1, s2);
@@ -10744,7 +11880,7 @@ Index: gcc/graphite-scop-detection.c
s1 = combined;
else
add_scop (s2);
-@@ -931,6 +943,8 @@
+@@ -931,6 +962,8 @@
&& niter_desc.control.no_overflow
&& (niter = number_of_latch_executions (loop))
&& !chrec_contains_undetermined (niter)
@@ -52281,6 +53417,31 @@ Index: gcc/ira-costs.c
/* Return pointer to structure containing costs of allocno or pseudo
with given NUM in array ARR. */
+Index: gcc/tree-inline.c
+===================================================================
+--- a/src/gcc/tree-inline.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/tree-inline.c (.../branches/gcc-6-branch)
+@@ -4719,7 +4719,7 @@
+ {
+ tree name = gimple_call_lhs (stmt);
+ tree var = SSA_NAME_VAR (name);
+- tree def = ssa_default_def (cfun, var);
++ tree def = var ? ssa_default_def (cfun, var) : NULL;
+
+ if (def)
+ {
+@@ -4730,6 +4730,11 @@
+ }
+ else
+ {
++ if (!var)
++ {
++ var = create_tmp_reg_fn (cfun, TREE_TYPE (name), NULL);
++ SET_SSA_NAME_VAR_OR_IDENTIFIER (name, var);
++ }
+ /* Otherwise make this variable undefined. */
+ gsi_remove (&stmt_gsi, true);
+ set_ssa_default_def (cfun, var, name);
Index: gcc/graphite-sese-to-poly.c
===================================================================
--- a/src/gcc/graphite-sese-to-poly.c (.../tags/gcc_6_3_0_release)
@@ -52371,6 +53532,69 @@ Index: gcc/config.host
case ${target} in
aarch64*-*-*)
host_extra_gcc_objs="driver-aarch64.o"
+Index: gcc/Makefile.in
+===================================================================
+--- a/src/gcc/Makefile.in (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/Makefile.in (.../branches/gcc-6-branch)
+@@ -787,6 +787,7 @@
+ CPP_INSTALL_NAME := $(shell echo cpp|sed '$(program_transform_name)')
+ GCOV_INSTALL_NAME := $(shell echo gcov|sed '$(program_transform_name)')
+ GCOV_TOOL_INSTALL_NAME := $(shell echo gcov-tool|sed '$(program_transform_name)')
++GCOV_DUMP_INSTALL_NAME := $(shell echo gcov-dump|sed '$(program_transform_name)')
+
+ # Setup the testing framework, if you have one
+ EXPECT = `if [ -f $${rootme}/../expect/expect ] ; then \
+@@ -3408,6 +3409,15 @@
+ gcov-tool$(exeext) $(DESTDIR)$(bindir)/$(GCOV_TOOL_INSTALL_NAME)$(exeext); \
+ fi; \
+ fi
++# Install gcov-dump if it was compiled.
++ -if test "$(enable_as_accelerator)" != "yes" ; then \
++ if [ -f gcov-dump$(exeext) ]; \
++ then \
++ rm -f $(DESTDIR)$(bindir)/$(GCOV_DUMP_INSTALL_NAME)$(exeext); \
++ $(INSTALL_PROGRAM) \
++ gcov-dump$(exeext) $(DESTDIR)$(bindir)/$(GCOV_DUMP_INSTALL_NAME)$(exeext); \
++ fi; \
++ fi
+
+ # Install the driver program as $(target_noncanonical)-gcc,
+ # $(target_noncanonical)-gcc-$(version), and also as gcc if native.
+Index: gcc/gimple.c
+===================================================================
+--- a/src/gcc/gimple.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/gimple.c (.../branches/gcc-6-branch)
+@@ -2487,7 +2487,16 @@
+ if (!targs)
+ return true;
+ tree arg = gimple_call_arg (stmt, i);
+- if (!useless_type_conversion_p (TREE_VALUE (targs), TREE_TYPE (arg)))
++ tree type = TREE_VALUE (targs);
++ if (!useless_type_conversion_p (type, TREE_TYPE (arg))
++ /* char/short integral arguments are promoted to int
++ by several frontends if targetm.calls.promote_prototypes
++ is true. Allow such promotion too. */
++ && !(INTEGRAL_TYPE_P (type)
++ && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
++ && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
++ && useless_type_conversion_p (integer_type_node,
++ TREE_TYPE (arg))))
+ return false;
+ targs = TREE_CHAIN (targs);
+ }
+Index: gcc/gimple-expr.c
+===================================================================
+--- a/src/gcc/gimple-expr.c (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/gimple-expr.c (.../branches/gcc-6-branch)
+@@ -123,7 +123,7 @@
+ /* Fixed point types with the same mode are compatible. */
+ else if (FIXED_POINT_TYPE_P (inner_type)
+ && FIXED_POINT_TYPE_P (outer_type))
+- return true;
++ return TYPE_SATURATING (inner_type) == TYPE_SATURATING (outer_type);
+
+ /* We need to take special care recursing to pointed-to types. */
+ else if (POINTER_TYPE_P (inner_type)
Index: gcc/tree-ssa-reassoc.c
===================================================================
--- a/src/gcc/tree-ssa-reassoc.c (.../tags/gcc_6_3_0_release)
@@ -54495,6 +55719,24 @@ Index: gcc/config/i386/i386.c
IX86_BUILTIN_SCATTERPFQPS);
/* SHA */
+@@ -45938,10 +45938,16 @@
+ if (recog_memoized (insn) < 0)
+ {
+ rtx_insn *seq;
++ machine_mode innermode = GET_MODE_INNER (mode);
++ rtx reg;
++
+ /* If that fails, force VAL into a register. */
+
+ start_sequence ();
+- XEXP (dup, 0) = force_reg (GET_MODE_INNER (mode), val);
++ reg = force_reg (innermode, val);
++ if (GET_MODE (reg) != innermode)
++ reg = gen_lowpart (innermode, reg);
++ XEXP (dup, 0) = reg;
+ seq = get_insns ();
+ end_sequence ();
+ if (seq)
Index: gcc/config/tilegx/tilegx.c
===================================================================
--- a/src/gcc/config/tilegx/tilegx.c (.../tags/gcc_6_3_0_release)
@@ -55219,6 +56461,17 @@ Index: gcc/config/rs6000/rs6000.md
; SF/DF suffix for traditional floating instructions
(define_mode_attr Ftrad [(SF "s") (DF "")])
+@@ -3066,8 +3063,8 @@
+ && ! reg_mentioned_p (operands[3], operands[1])
+ && ! reg_mentioned_p (operands[3], operands[2])"
+ [(set (match_dup 0)
+- (div:GPR (match_dup 1)
+- (match_dup 2)))
++ (udiv:GPR (match_dup 1)
++ (match_dup 2)))
+ (set (match_dup 3)
+ (mult:GPR (match_dup 0)
+ (match_dup 2)))
@@ -4616,7 +4613,7 @@
(define_insn_and_split "signbit<mode>2_dm"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r")
@@ -55486,6 +56739,19 @@ Index: gcc/config/pa/pa-64.h
/* In the PA architecture, it is not possible to directly move data
between GENERAL_REGS and FP_REGS. On the 32-bit port, we use the
+Index: gcc/params.def
+===================================================================
+--- a/src/gcc/params.def (.../tags/gcc_6_3_0_release)
++++ b/src/gcc/params.def (.../branches/gcc-6-branch)
+@@ -1191,7 +1191,7 @@
+ "max-ssa-name-query-depth",
+ "Maximum recursion depth allowed when querying a property of an"
+ " SSA name.",
+- 3, 1, 0)
++ 3, 1, 10)
+
+ DEFPARAM (PARAM_MAX_RTL_IF_CONVERSION_INSNS,
+ "max-rtl-if-conversion-insns",
Index: gcc/lto-streamer.h
===================================================================
--- a/src/gcc/lto-streamer.h (.../tags/gcc_6_3_0_release)
diff --git a/debian/rules.patch b/debian/rules.patch
index 5135ca4..f9b5e53 100644
--- a/debian/rules.patch
+++ b/debian/rules.patch
@@ -110,7 +110,6 @@ debian_patches += \
mips-pr78176-add-mlxc1-sxc1 \
mips-loongson3a-use-fused-madd.d \
mips-madd4 \
- install-gcov-dump \
gcc-fuse-ld-lld \
ifeq ($(libstdcxx_abi),new)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/gcc-6.git
More information about the Reproducible-commits
mailing list