Rebase gcc to 6.1.0

This requires one fix from the upstream gcc-6-branch for a C++
frontend bug that bites on some Magenta kernel code.

Change-Id: I551710207bfdcad3f0fa5d6e05561709c2ede375
diff --git a/patches/gcc-patch.txt b/patches/gcc-patch.txt
index b90aebb..c3d5d97 100644
--- a/patches/gcc-patch.txt
+++ b/patches/gcc-patch.txt
@@ -80,3 +80,109 @@
  	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/i386elf.h i386/x86-64.h"
  	;;
  i[34567]86-*-rdos*)
+
+
+commit c75b90dacb047d2bf690925c9b45100accb85b98
+Author: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date:   Thu Jul 21 06:16:17 2016 +0000
+
+    	PR c++/71092 - ICE with array and constexpr.
+    
+    	* constexpr.c (cxx_eval_call_expression): Fail quietly when cgraph
+    	threw away DECL_SAVED_TREE.
+    
+    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@238574 138bc75d-0d04-0410-961f-82ee72b054a4
+
+diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
+index 5f434aa..fba7905 100644
+--- a/gcc/cp/constexpr.c
++++ b/gcc/cp/constexpr.c
+@@ -1450,9 +1450,19 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
+     }
+   else
+     {
+-      if (!result || result == error_mark_node)
++      if (result && result != error_mark_node)
++	/* OK */;
++      else if (!DECL_SAVED_TREE (fun))
++	{
++	  /* When at_eof >= 2, cgraph has started throwing away
++	     DECL_SAVED_TREE, so fail quietly.  FIXME we get here because of
++	     late code generation for VEC_INIT_EXPR, which needs to be
++	     completely reconsidered.  */
++	  gcc_assert (at_eof >= 2 && ctx->quiet);
++	  *non_constant_p = true;
++	}
++      else
+ 	{
+-	  gcc_assert (DECL_SAVED_TREE (fun));
+ 	  tree body, parms, res;
+ 
+ 	  /* Reuse or create a new unshared copy of this function's body.  */
+diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C
+new file mode 100644
+index 0000000..c6afa50
+--- /dev/null
++++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array17.C
+@@ -0,0 +1,61 @@
++// PR c++/71092
++// { dg-do compile { target c++11 } }
++
++template <typename _Default> struct A { using type = _Default; };
++template <typename _Default, template <typename> class>
++using __detected_or = A<_Default>;
++template <typename _Default, template <typename> class _Op>
++using __detected_or_t = typename __detected_or<_Default, _Op>::type;
++template <typename _Tp> struct B { typedef _Tp value_type; };
++struct C {
++  template <typename _Tp> using __pointer = typename _Tp::pointer;
++};
++template <typename _Alloc> struct J : C {
++  using pointer = __detected_or_t<typename _Alloc::value_type *, __pointer>;
++};
++template <typename _T1> void _Construct(_T1 *) { new _T1; }
++struct D {
++  template <typename _ForwardIterator, typename _Size>
++  static _ForwardIterator __uninit_default_n(_ForwardIterator p1, _Size) {
++    _Construct(p1);
++  }
++};
++template <typename _ForwardIterator, typename _Size>
++void __uninitialized_default_n(_ForwardIterator p1, _Size) {
++  D::__uninit_default_n(p1, 0);
++}
++template <typename _ForwardIterator, typename _Size, typename _Tp>
++void __uninitialized_default_n_a(_ForwardIterator p1, _Size, _Tp) {
++  __uninitialized_default_n(p1, 0);
++}
++template <typename> struct __shared_ptr {
++  constexpr __shared_ptr() : _M_ptr(), _M_refcount() {}
++  int _M_ptr;
++  int _M_refcount;
++};
++template <typename _Alloc> struct F {
++  typedef _Alloc _Tp_alloc_type;
++  struct G {
++    typename J<_Tp_alloc_type>::pointer _M_start;
++    G(_Tp_alloc_type);
++  };
++  F(int, _Alloc p2) : _M_impl(p2) {}
++  G _M_impl;
++};
++template <typename _Tp, typename _Alloc = B<_Tp>> struct K : F<_Alloc> {
++  typedef _Alloc allocator_type;
++  K(int, allocator_type p2 = allocator_type()) : F<_Alloc>(0, p2) {
++    __uninitialized_default_n_a(this->_M_impl._M_start, 0, 0);
++  }
++};
++struct H {
++  H();
++  struct I {
++    __shared_ptr<int> trigger[1];
++  };
++  __shared_ptr<int> resetTrigger_;
++  K<I> states_;
++  __shared_ptr<int> triggerManager_;
++};
++__shared_ptr<int> a;
++H::H() : states_(0), triggerManager_(a) {}
diff --git a/toolvers b/toolvers
index e48bf3c..9a2e9c1 100644
--- a/toolvers
+++ b/toolvers
@@ -1,12 +1,12 @@
 # Rerun updatetoolvers after modifying this file
-GCCVER=5.3.0
+GCCVER=6.1.0
 BINVER=2.27
 GDBVER=7.10.1
 GMPVER=5.1.3
 MPCVER=1.0.3
 MPFRVER=3.1.3
 # Below is autogenerated by updatetoolvers
-GCCHASH=b84f5592e9218b73dbae612b5253035a7b34a9a1f7688d2e1bfaaf7267d5c4db
+GCCHASH=09c4c85cabebb971b1de732a0219609f93fc0af5f86f6e437fd8d7f832f1a351
 BINHASH=369737ce51587f92466041a97ab7d2358c6d9e1b6490b3940eb09fb0a9a6ac88
 GDBHASH=25c72f3d41c7c8554d61cacbeacd5f40993276d2ccdec43279ac546e3993d6d5
 GMPHASH=752079520b4690531171d0f4532e40f08600215feefede70b24fabdc6f1ab160