-From: Jens Lody <fedora@jenslody.de>
-Date: Thu, 16 Feb 2017 09:31:56 +0100
-Subject: Backport of fix for mozilla-bug 1269171, needed for gcc7.
-
-diff --git a/mozilla/config/gcc-stl-wrapper.template.h b/mozilla/config/gcc-stl-wrapper.template.h
---- a/mozilla/config/gcc-stl-wrapper.template.h
-+++ b/mozilla/config/gcc-stl-wrapper.template.h
-@@ -17,25 +17,6 @@
- // Silence "warning: #include_next is a GCC extension"
- #pragma GCC system_header
-
--// mozalloc.h wants <new>; break the cycle by always explicitly
--// including <new> here. NB: this is a tad sneaky. Sez the gcc docs:
--//
--// `#include_next' does not distinguish between <file> and "file"
--// inclusion, nor does it check that the file you specify has the
--// same name as the current file. It simply looks for the file
--// named, starting with the directory in the search path after the
--// one where the current file was found.
--#include_next <new>
--
--// See if we're in code that can use mozalloc. NB: this duplicates
--// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
--// can't build with that being included before base/basictypes.h.
--#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
--# include "mozilla/mozalloc.h"
--#else
--# error "STL code can only be used with infallible ::operator new()"
--#endif
--
- #if defined(DEBUG) && !defined(_GLIBCXX_DEBUG)
- // Enable checked iterators and other goodies
- //
-@@ -46,10 +27,34 @@
- // # define _GLIBCXX_DEBUG 1
- #endif
-
-+// Don't include mozalloc for cstdlib. See bug 1245076.
-+#ifndef moz_dont_include_mozalloc_for_cstdlib
-+# define moz_dont_include_mozalloc_for_cstdlib
-+#endif
-+
-+// Include mozalloc after the STL header and all other headers it includes
-+// have been preprocessed.
-+#if !defined(MOZ_INCLUDE_MOZALLOC_H) && \
-+ !defined(moz_dont_include_mozalloc_for_${HEADER})
-+# define MOZ_INCLUDE_MOZALLOC_H
-+# define MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER}
-+#endif
-+
- #pragma GCC visibility push(default)
- #include_next <${HEADER}>
- #pragma GCC visibility pop
-
-+#ifdef MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER}
-+// See if we're in code that can use mozalloc. NB: this duplicates
-+// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
-+// can't build with that being included before base/basictypes.h.
-+# if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
-+# include "mozilla/mozalloc.h"
-+# else
-+# error "STL code can only be used with infallible ::operator new()"
-+# endif
-+#endif
-+
- // gcc calls a __throw_*() function from bits/functexcept.h when it
- // wants to "throw an exception". functexcept exists nominally to
- // support -fno-exceptions, but since we'll always use the system
---- a/mozilla/config/make-stl-wrappers.py
-+++ b/mozilla/config/make-stl-wrappers.py
-@@ -25,28 +25,26 @@ def header_path(header, compiler):
- def is_comment(line):
- return re.match(r'\s*#.*', line)
-
- def main(outdir, compiler, template_file, header_list_file):
- if not os.path.isdir(outdir):
- os.mkdir(outdir)
-
- template = open(template_file, 'r').read()
-- path_to_new = header_path('new', compiler)
-
- for header in open(header_list_file, 'r'):
- header = header.rstrip()
- if 0 == len(header) or is_comment(header):
- continue
-
- path = header_path(header, compiler)
- with FileAvoidWrite(os.path.join(outdir, header)) as f:
- f.write(string.Template(template).substitute(HEADER=header,
-- HEADER_PATH=path,
-- NEW_HEADER_PATH=path_to_new))
-+ HEADER_PATH=path))
-
-
- if __name__ == '__main__':
- if 5 != len(sys.argv):
- print("""Usage:
- python {0} OUT_DIR ('msvc'|'gcc') TEMPLATE_FILE HEADER_LIST_FILE
- """.format(sys.argv[0]), file=sys.stderr)
- sys.exit(1)
-diff --git a/mozilla/config/msvc-stl-wrapper.template.h b/mozilla/config/msvc-stl-wrapper.template.h
---- a/mozilla/config/msvc-stl-wrapper.template.h
-+++ b/mozilla/config/msvc-stl-wrapper.template.h
-@@ -3,45 +3,33 @@
- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
- #ifndef mozilla_${HEADER}_h
- #define mozilla_${HEADER}_h
-
--#ifndef MOZ_HAVE_INCLUDED_ALLOC
--#define MOZ_HAVE_INCLUDED_ALLOC
--
- #if _HAS_EXCEPTIONS
- # error "STL code can only be used with -fno-exceptions"
- #endif
-
-+// Include mozalloc after the STL header and all other headers it includes
-+// have been preprocessed.
-+#if !defined(MOZ_INCLUDE_MOZALLOC_H)
-+# define MOZ_INCLUDE_MOZALLOC_H
-+# define MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER}
-+#endif
-+
- // Code built with !_HAS_EXCEPTIONS calls std::_Throw(), but the win2k
- // CRT doesn't export std::_Throw(). So we define it.
- #ifndef mozilla_Throw_h
- # include "mozilla/throw_msvc.h"
- #endif
-
--// Code might include <new> before other wrapped headers, but <new>
--// includes <exception> and so we want to wrap it. But mozalloc.h
--// wants <new> also, so we break the cycle by always explicitly
--// including <new> here.
--#include <${NEW_HEADER_PATH}>
--
--// See if we're in code that can use mozalloc. NB: this duplicates
--// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
--// can't build with that being included before base/basictypes.h.
--#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
--# include "mozilla/mozalloc.h"
--#else
--# error "STL code can only be used with infallible ::operator new()"
--#endif
--#endif /* MOZ_HAVE_INCLUDED_ALLOC */
--
- #ifdef _DEBUG
- // From
- // http://msdn.microsoft.com/en-us/library/aa985982%28VS.80%29.aspx
- // and
- // http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx
- // there appear to be two types of STL container checking. The
- // former is enabled by -D_DEBUG (which is implied by -MDd or -MTd), and
- // looks to be full generation/mutation checked iterators as done by
-@@ -70,9 +58,20 @@
- // but that's OK because we're not throwing them.
- #pragma warning( push )
- #pragma warning( disable : 4275 4530 )
-
- #include <${HEADER_PATH}>
-
- #pragma warning( pop )
-
-+#ifdef MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER}
-+// See if we're in code that can use mozalloc. NB: this duplicates
-+// code in nscore.h because nscore.h pulls in prtypes.h, and chromium
-+// can't build with that being included before base/basictypes.h.
-+# if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC)
-+# include "mozilla/mozalloc.h"
-+# else
-+# error "STL code can only be used with infallible ::operator new()"
-+# endif
-+#endif
-+
- #endif // if mozilla_${HEADER}_h
-diff --git a/mozilla/memory/mozalloc/mozalloc.h b/mozilla/memory/mozalloc/mozalloc.h
---- a/mozilla/memory/mozalloc/mozalloc.h
-+++ b/mozilla/memory/mozalloc/mozalloc.h
-@@ -7,20 +7,27 @@
-
- #ifndef mozilla_mozalloc_h
- #define mozilla_mozalloc_h
-
- /*
- * https://bugzilla.mozilla.org/show_bug.cgi?id=427099
- */
-
--#include <stdlib.h>
--#include <string.h>
- #if defined(__cplusplus)
- # include <new>
-+// Since libstdc++ 6, including the C headers (e.g. stdlib.h) instead of the
-+// corresponding C++ header (e.g. cstdlib) can cause confusion in C++ code
-+// using things defined there. Specifically, with stdlib.h, the use of abs()
-+// in gfx/graphite2/src/inc/UtfCodec.h somehow ends up picking the wrong abs()
-+# include <cstdlib>
-+# include <cstring>
-+#else
-+# include <stdlib.h>
-+# include <string.h>
- #endif
-
- #if defined(__cplusplus)
- #include "mozilla/fallible.h"
- #include "mozilla/TemplateLib.h"
- #endif
- #include "mozilla/Attributes.h"
- #include "mozilla/Types.h"
-
-